реклама на сайте
подробности

 
 
> __raw прерывания
fmdost
сообщение Jun 11 2007, 22:07
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Доброго времени суток, подскажите pls как в прерывании перенести сохранение регистров по своему усмотрению. Мне нужно как можно быстрее дёрнуть ногой, а потом выполнить С код.

камень mega88;

__interrupt //Штатно сохраняет все далее используемые регистры.

// и только после этого
PORTx=1;

//~далее С код

==========
А надо так

__interrupt

PORTx=1;

//Штатно сохранить все далее используемые регистры.
//~С код

В асме так делается очень часто, в описании на IAR и на CAVR нашёл только __raw, но он не сохраняет регистры вообще.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Jun 11 2007, 22:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вам в пустыне уже все разжевали, теперь еще и тут та же пестня?
Ну вот вам пример. Правда для MSP430, т.к. ИАР для АВР не имею.
Исходный текст функции перывания.
Код
extern float calcBlaBla (float a_data, float b_data, float c_data);

#pragma vector = WDT_VECTOR
__interrupt __raw void WDTimer_ISR(void)
{ P1OUT^=BIT0;
  float tmp=calcBlaBla(1.0, 4.0, 2.0);
  printf("%f0.3", tmp);
}

А вот во что его скомпилировал ИАР.
Код
      49          #pragma vector = WDT_VECTOR

   \                                 In segment CODE, align 2
     50          __interrupt __raw void WDTimer_ISR(void)
   \                     WDTimer_ISR:
     51          { P1OUT^=BIT0;
   \   000000   D2E32100     XOR.B   #0x1, &0x21
     52            float tmp=calcBlaBla(1.0, 4.0, 2.0);
   \   000004   30120040     PUSH.W  #0x4000
   \   000008   0312         PUSH.W  #0x0
   \   00000A   0E43         MOV.W   #0x0, R14
   \   00000C   3F408040     MOV.W   #0x4080, R15
   \   000010   0C43         MOV.W   #0x0, R12
   \   000012   3D40803F     MOV.W   #0x3f80, R13
   \   000016   B012....     CALL    #calcBlaBla
     53            printf("%f0.3", tmp);
   \   00001A   0D12         PUSH.W  R13
   \   00001C   0C12         PUSH.W  R12
   \   00001E   3C40....     MOV.W   #`?<Constant "%f0.3">`, R12
   \   000022   B012....     CALL    #printf
     54          }
   \   000026   3152         ADD.W   #0x8, SP
   \   000028   0013         RETI

Как вы можете заметить в прерывании первой командой (XOR.B #0x1, &0x21) дергается нога контроллера P1.0 (инвертируется ее состояние). Потом в стек пихаются значения для функции calcBlaBla и вызывается сама функция. Затем вызывается printf. Стек выравнивается, т.к. все возвращаемые значения не используются. Дальше возврат из прерывания.
То что вам нужно, не так ли? wink.gif
Кстати, зачем вам нужно сохранять ВСЕ регистры? Мне это не понятно. Компилятор сохраняет в стеке только те из них, которые используются в вызываемой функции.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Т.Достоевский   __raw прерывания   Jun 11 2007, 22:07
- - Т.Достоевский   Это СОВСЕМ не то что мне нужно, тк он НЕ СОХРАНИЛ ...   Jun 11 2007, 23:10
- - rezident   Опс! Ну да. Вы правы. Я забыл что это прерыван...   Jun 11 2007, 23:32
- - Т.Достоевский   Но тогда придётся сохранять юзанные регистры ручка...   Jun 11 2007, 23:39
|- - Сергей Борщ   Цитата(Т.Достоевский @ Jun 12 2007, 02:39...   Jun 12 2007, 06:34
|- - IgorKossak   Цитата(Т.Достоевский @ Jun 12 2007, 02:39...   Jun 12 2007, 07:37
||- - Сергей Борщ   Цитата(IgorKossak @ Jun 12 2007, 10:37) Э...   Jun 12 2007, 10:30
|- - singlskv   Цитата(Т.Достоевский @ Jun 12 2007, 03:39...   Jun 12 2007, 13:59
- - Т.Достоевский   "Ваша ошибка в самом алгоритме, вам на нее =A...   Jun 12 2007, 11:29
|- - Сергей Борщ   Цитата(Т.Достоевский @ Jun 12 2007, 14:29...   Jun 12 2007, 12:46
- - Т.Достоевский   Принцип такой tc0 это прерывание по переполнению t...   Jun 12 2007, 13:58
|- - Сергей Борщ   Цитата(Т.Достоевский @ Jun 12 2007, 16:58...   Jun 12 2007, 14:57
|- - singlskv   Цитата(Сергей Борщ @ Jun 12 2007, 18:57) ...   Jun 12 2007, 16:05
|- - Т.Достоевский   Цитата(singlskv @ Jun 12 2007, 20:05) Есл...   Jun 12 2007, 16:14
- - Т.Достоевский   Вы совеошенно правы прерывание мешает другое (адс)...   Jun 12 2007, 15:56
|- - singlskv   Цитата(Т.Достоевский @ Jun 12 2007, 19:56...   Jun 12 2007, 16:15
|- - Т.Достоевский   Цитата(singlskv @ Jun 12 2007, 20:15) jmp...   Jun 12 2007, 16:19
|- - singlskv   по Вашей ссылке прерывания ADC не увидел, дальше н...   Jun 12 2007, 16:36
- - Т.Достоевский   В том то и дело, в меге нету абсолютного jmp!....   Jun 12 2007, 16:48
- - slog   Ты и тут уже :-) __indirect_jump_to((unsigned lon...   Jun 12 2007, 17:11
|- - Т.Достоевский   Цитата(slog @ Jun 12 2007, 21:11) Ты и ту...   Jun 12 2007, 17:15
||- - singlskv   Цитата(Т.Достоевский @ Jun 12 2007, 21:15...   Jun 12 2007, 17:21
||- - rezident   Цитата(singlskv @ Jun 12 2007, 23:21) не....   Jun 12 2007, 19:57
|- - Т.Достоевский   Цитата(slog @ Jun 12 2007, 21:11) __indir...   Jun 12 2007, 20:14
|- - rezident   Цитата(Т.Достоевский @ Jun 13 2007, 02:14...   Jun 12 2007, 20:37
- - Т.Достоевский   __indirect_jump_to((unsigned long)&Имя_функции...   Jun 12 2007, 20:49
|- - Сергей Борщ   Цитата(Т.Достоевский @ Jun 12 2007, 23:49...   Jun 13 2007, 07:07
|- - Т.Достоевский   Цитата(Сергей Борщ @ Jun 13 2007, 11:07) ...   Jun 13 2007, 09:50
|- - IgorKossak   Цитата(Т.Достоевский @ Jun 13 2007, 12:50...   Jun 13 2007, 14:19
|- - Т.Достоевский   Цитата(IgorKossak @ Jun 13 2007, 18:19) Т...   Jun 13 2007, 17:02
|- - IgorKossak   Цитата(Т.Достоевский @ Jun 13 2007, 20:02...   Jun 13 2007, 18:21
|- - Т.Достоевский   Цитата(IgorKossak @ Jun 13 2007, 22:21) Н...   Jun 13 2007, 19:24
- - slog   Незнаю #pragma vector = TIMER0_OVF0_vect __interr...   Jun 13 2007, 04:03
- - Rst7   Делаю так обычно, ужос конечно, но что поделать: ...   Jun 13 2007, 08:12
- - SasaVitebsk   Извините, что я вмешиваюсь в столь лихо закрученну...   Jun 13 2007, 20:20
|- - Т.Достоевский   Цитата(SasaVitebsk @ Jun 14 2007, 00:20) ...   Jun 13 2007, 21:04
- - Rst7   Про недокументированные модификаторы для AVR поищи...   Jun 14 2007, 05:12
- - SasaVitebsk   В этом смысле платформы для микропроцессоров даже ...   Jun 14 2007, 17:44
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 14 2007, 20:44) ...   Jun 14 2007, 18:37
|- - Т.Достоевский   Цитата(SasaVitebsk @ Jun 14 2007, 21:44) ...   Jun 14 2007, 18:42
- - IgorKossak   Вот и славненько! На этой мажорной ноте предла...   Jun 14 2007, 21:04
- - Т.Достоевский   Цитата(IgorKossak @ Jun 15 2007, 01:04) В...   Jun 14 2007, 21:39


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016