|
|
  |
Как заменить ассемблерный обработчик прерываний на Си-шный? |
|
|
|
Mar 13 2008, 08:30
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-06-07
Пользователь №: 28 233

|
Имеется работающий проект в IAR 2.31. Обработчик прерываний написан на асме. Есть необходимость заменить обработчик, причём на написанный на С. Попытки сделать это методом тыка провалились, а разобраться по хелпу тоже не удалось. Удалил из проекта асмовский файл, добавил сишный. Сам файл с обработчиком (потом он будет покруче  ) Цитата #include "iom8.h" #include "ina90.h" interrupt [SPI_STC_vect] void SPI_STC(void){ N_OUT=SPDR; } IAR ругается на слово "interrupt", вторая ошибка явно наведенная: Цитата interrupt.c (6) : Error[Pe077]: this declaration has no storage class or type specifier interrupt.c (6) : Error[Pe065]: expected a ";" Как его туда втулить, чтобы приняли за своего?
|
|
|
|
|
Mar 13 2008, 09:09
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата(Алекс-666 @ Mar 13 2008, 11:30)  Имеется работающий проект в IAR 2.31. Обработчик прерываний написан на асме. Есть необходимость заменить обработчик, причём на написанный на С. Попытки сделать это методом тыка провалились, а разобраться по хелпу тоже не удалось. Удалил из проекта асмовский файл, добавил сишный. Сам файл с обработчиком (потом он будет покруче  ) IAR ругается на слово "interrupt", вторая ошибка явно наведенная: Как его туда втулить, чтобы приняли за своего?  Вот обработчик прерывания, правда для таймера и IAR 4.20: //***Обработчик прерывания Т/С0*** #pragma vector = TIMER1_COMPA_vect __interrupt void timer1_compa_isr(void) { Тело обработчика }
|
|
|
|
|
Mar 13 2008, 09:32
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-06-07
Пользователь №: 28 233

|
Спасибо, сэр! Опробовал, работает. Непонятно, почему не работал предыдущий синтаксис (работавший в других проектах), но это уже праздное любопытство...
|
|
|
|
|
Mar 14 2008, 08:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(MrYuran @ Mar 14 2008, 10:13)  Оставьте старый вариант на случай, если вдруг понадобится компилить под GCC. Там как раз такой синтаксис (кстати говоря, стандартный) Интересно-интересно... Вот вырезка из avr-libc, в которой видно, какой синтаксис применяется в avr-gcc: Код #ifdef __cplusplus #define ISR(vector) \ extern "C" void vector(void) __attribute__ ((signal,__INTR_ATTRS)); \ void vector (void) #else #define ISR(vector) \ void vector (void) __attribute__ ((signal,__INTR_ATTRS)); \ void vector (void) #endif Соответственно описание вектора выглядит как Код ISR(TIMER1_COMPA_vect) { }
или, если развернуто
void TIMER1_COMPA_vect (void) __attribute__ ((signal,__INTR_ATTRS)); void TIMER1_COMPA_vect (void) { } Не вижу ничего общего. Не могли бы вы привести ссылочку на описание вашего стандартного синтаксиса?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 14 2008, 22:57
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zltigo @ Mar 15 2008, 02:38)  Я на __interrupt не покушаюсь - это есть минимальная и достаточная необходимость, мне применение излишеств типа #pragma vector совсем не нравится. Дык, а в новых версиях IAR прерывания вообще можно описать вот так Код //***Обработчик прерывания Т/С0*** #pragma vector = TIMER1_COMPA_vect #pragma type_attribute=__interrupt void timer1_compa_isr(void) { Тело обработчика } По-моему это еще более ближе к стандарту. Дописав всего две прагмы любую стандартную функцию без аргументов можно превратить в обработчик прерывания.
|
|
|
|
|
Mar 15 2008, 07:19
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(rezident @ Mar 15 2008, 01:57)  Дописав всего две прагмы любую стандартную функцию без аргументов можно превратить в обработчик прерывания. Проблема не в "превратить в обработчик" - это есть необходимое указание комилятору и его необходимо сделать тем или иным способом. Проблема в "засунуть указатель туда не знаю и знать не хочу куда, но что-бы работало". Вот такое "ценное указание" уже стремно делать. Цитата Мне не нравится редактирование cstartup ... Не нравится, и не нужно можно приберечь, например, для приложений под какие-либо системы - для таких и подобных стандартизированно-вырожденных случаев о statаrtup можно и забыть, да и не знать о его существовании вообще. Для случаев поднятия чего-либо с 0 со стартапом следует ознакомиться, ну а после ознакомления уже собственно и дописать строчку - другую (уже со знанием дела, а не в слепую через общие указания типа прагм) труда не составит никакого.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|