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

 
 
> __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
Ответов
Rst7
сообщение Jun 13 2007, 08:12
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Делаю так обычно, ужос конечно, но что поделать:

в .c
Код
#pragma vector=0x0E //Неиспользуемый вектор
__interrupt void doADC(void)
{
  char c=OCR1B;
  //  unsigned int d;
//  __enable_interrupt();
  switch(ADCstate)
  {
  default:
....
и далее


в .asm (тоже подключен к проекту)
Код

        RSEG CODE:CODE:NOROOT(1)
intADC:
        SEI
        EXTERN doADC
        RJMP doADC

        COMMON INTVEC:CODE:ROOT(1)
        ORG 22
        RJMP    intADC
        END


соответственно в асм можно вставить быстрый код

И даже еще проще и лучше, без доп. асмов
Код
#include "iom8.h"
#include "inavr.h"


//Также в настройках проекта запретить линкеру диагностику w22
#pragma diag_suppress=Ta006
__interrupt void IntLong(void)
{
  __no_operation();
  __no_operation();
  __no_operation();
  __no_operation();
  __no_operation();
  __no_operation();
}
#pragma diag_default=Ta006

#pragma vector=TIMER1_OVF_vect
__raw __interrupt void I1(void)
{
  __enable_interrupt();
  ((void (*)(void))IntLong)();
}

int main( void )
{
  return 0;
}


Код
      1          #include "iom8.h"
      2          #include "inavr.h"
      3          
      4          
      5          //Также линкеру запретить w22
      6          #pragma diag_suppress=Ta006

   \                                 In segment CODE, align 2, keep-with-next
      7          __interrupt void IntLong(void)
   \                     IntLong:
      8          {
      9            __no_operation();
   \   00000000   0000               NOP
     10            __no_operation();
   \   00000002   0000               NOP
     11            __no_operation();
   \   00000004   0000               NOP
     12            __no_operation();
   \   00000006   0000               NOP
     13            __no_operation();
   \   00000008   0000               NOP
     14            __no_operation();
   \   0000000A   0000               NOP
     15          }
   \   0000000C   9518               RETI
     16          #pragma diag_default=Ta006
     17          
     18          #pragma vector=TIMER1_OVF_vect

   \                                 In segment CODE, align 2, keep-with-next
     19          __raw __interrupt void I1(void)
   \                     I1:
     20          {
     21            __enable_interrupt();
   \   00000000   9478               SEI
     22            ((void (*)(void))IntLong)();
   \   00000002   ....               RCALL   IntLong
     23          }
   \   00000004   9518               RETI
     24          

   \                                 In segment CODE, align 2, keep-with-next
     25          int main( void )
   \                     main:
     26          {
     27            return 0;
   \   00000000   E000               LDI     R16, 0
   \   00000002   E010               LDI     R17, 0
   \   00000004   9508               RET
     28          }

   \                                 In segment INTVEC, offset 0x10, root
   \                     `??I1??INTVEC 16`:
   \   00000010   ....               RJMP    I1


Но все это костыли, применение которых должно быть оправдано на 150% и им не место в обычных проектах.

И вот расширенный вариант, из которого все виднее

Код
#include "iom8.h"
#include "inavr.h"
#include "string.h"


//Также линкеру запретить w22
#pragma diag_suppress=Ta006
__interrupt void IntLong(void)
{
  strcmp("abc","def");
}
#pragma diag_default=Ta006

#pragma vector=TIMER1_OVF_vect
__raw __interrupt void I1(void)
{
  __enable_interrupt();
  PORTB|=0x1;
  ((void (*)(void))IntLong)();
}

int main( void )
{
  return 0;
}


Код
      1          #include "iom8.h"

   \                                 In segment ABSOLUTE, at 0x38
   \   union <unnamed> volatile __io _A_PORTB
   \                     _A_PORTB:
   \   00000000                      DS 1
      2          #include "inavr.h"
      3          #include "string.h"
      4          
      5          
      6          //Также линкеру запретить w22
      7          #pragma diag_suppress=Ta006

   \                                 In segment CODE, align 2, keep-with-next
      8          __interrupt void IntLong(void)
   \                     IntLong:
      9          {
   \   00000000   938A               ST      -Y, R24
   \   00000002   93FA               ST      -Y, R31
   \   00000004   93EA               ST      -Y, R30
   \   00000006   923A               ST      -Y, R3
   \   00000008   922A               ST      -Y, R2
   \   0000000A   921A               ST      -Y, R1
   \   0000000C   920A               ST      -Y, R0
   \   0000000E   937A               ST      -Y, R23
   \   00000010   936A               ST      -Y, R22
   \   00000012   935A               ST      -Y, R21
   \   00000014   934A               ST      -Y, R20
   \   00000016   933A               ST      -Y, R19
   \   00000018   932A               ST      -Y, R18
   \   0000001A   931A               ST      -Y, R17
   \   0000001C   930A               ST      -Y, R16
   \   0000001E   B78F               IN      R24, 0x3F
     10            strcmp("abc","def");
   \   00000020   ....               LDI     R18, LOW((`?<Constant "abc">` + 4))
   \   00000022   ....               LDI     R19, HIGH((`?<Constant "abc">` + 4))
   \   00000024   ....               LDI     R16, LOW(`?<Constant "abc">`)
   \   00000026   ....               LDI     R17, (`?<Constant "abc">`) >> 8
   \   00000028   ....               RCALL   strcmp
     11          }
   \   0000002A   BF8F               OUT     0x3F, R24
   \   0000002C   9109               LD      R16, Y+
   \   0000002E   9119               LD      R17, Y+
   \   00000030   9129               LD      R18, Y+
   \   00000032   9139               LD      R19, Y+
   \   00000034   9149               LD      R20, Y+
   \   00000036   9159               LD      R21, Y+
   \   00000038   9169               LD      R22, Y+
   \   0000003A   9179               LD      R23, Y+
   \   0000003C   9009               LD      R0, Y+
   \   0000003E   9019               LD      R1, Y+
   \   00000040   9029               LD      R2, Y+
   \   00000042   9039               LD      R3, Y+
   \   00000044   91E9               LD      R30, Y+
   \   00000046   91F9               LD      R31, Y+
   \   00000048   9189               LD      R24, Y+
   \   0000004A   9518               RETI
     12          #pragma diag_default=Ta006
     13          
     14          #pragma vector=TIMER1_OVF_vect

   \                                 In segment CODE, align 2, keep-with-next
     15          __raw __interrupt void I1(void)
   \                     I1:
     16          {
     17            __enable_interrupt();
   \   00000000   9478               SEI
     18            PORTB|=0x1;
   \   00000002   9AC0               SBI     0x18, 0x00
     19            ((void (*)(void))IntLong)();
   \   00000004   ....               RCALL   IntLong
     20          }
   \   00000006   9518               RETI


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Т.Достоевский   __raw прерывания   Jun 11 2007, 22:07
- - rezident   Вам в пустыне уже все разжевали, теперь еще и тут ...   Jun 11 2007, 22:50
- - Т.Достоевский   Это СОВСЕМ не то что мне нужно, тк он НЕ СОХРАНИЛ ...   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
- - 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 Текстовая версия Сейчас: 24th July 2025 - 04:14
Рейтинг@Mail.ru


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