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

 
 
 
Reply to this topicStart new topic
> Как заменить ассемблерный обработчик прерываний на Си-шный?
Алекс-666
сообщение Mar 13 2008, 08:30
Сообщение #1


Участник
*

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



Имеется работающий проект в IAR 2.31. Обработчик прерываний написан на асме. Есть необходимость заменить обработчик, причём на написанный на С. Попытки сделать это методом тыка провалились, а разобраться по хелпу тоже не удалось.
Удалил из проекта асмовский файл, добавил сишный. Сам файл с обработчиком (потом он будет покруче smile.gif)
Цитата
#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 ";"

Как его туда втулить, чтобы приняли за своего? smile.gif
Go to the top of the page
 
+Quote Post
Igor26
сообщение Mar 13 2008, 09:09
Сообщение #2


Знающий
****

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



Цитата(Алекс-666 @ Mar 13 2008, 11:30) *
Имеется работающий проект в IAR 2.31. Обработчик прерываний написан на асме. Есть необходимость заменить обработчик, причём на написанный на С. Попытки сделать это методом тыка провалились, а разобраться по хелпу тоже не удалось.
Удалил из проекта асмовский файл, добавил сишный. Сам файл с обработчиком (потом он будет покруче smile.gif)

IAR ругается на слово "interrupt", вторая ошибка явно наведенная:

Как его туда втулить, чтобы приняли за своего? smile.gif

Вот обработчик прерывания, правда для таймера и IAR 4.20:

//***Обработчик прерывания Т/С0***
#pragma vector = TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void)
{
Тело обработчика
}
Go to the top of the page
 
+Quote Post
Алекс-666
сообщение Mar 13 2008, 09:32
Сообщение #3


Участник
*

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



Спасибо, сэр! Опробовал, работает.
Непонятно, почему не работал предыдущий синтаксис (работавший в других проектах), но это уже праздное любопытство...
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 13 2008, 10:12
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



потому что это не синтаксис IAR.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 13 2008, 10:51
Сообщение #5


Гуру
******

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



Цитата(vet @ Mar 13 2008, 12:12) *
потому что это не синтаксис IAR.
IAR, IAR. Просто очень старый, версий 1.хх


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 13 2008, 11:30
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Сергей Борщ,
теперь ясно, откуда оно появилось в CodeVisionAVR; будем знать smile.gif


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 14 2008, 08:13
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Оставьте старый вариант на случай, если вдруг понадобится компилить под GCC.
Там как раз такой синтаксис (кстати говоря, стандартный)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 08:34
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 14 2008, 08:49
Сообщение #9


Гуру
******

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



Цитата(Igor26 @ Mar 13 2008, 12:09) *
//***Обработчик прерывания Т/С0***
#pragma vector = TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void)
{
Тело обработчика
}

Извращенцы smile.gif smile.gif Прописываете в startup timer1_compa_isr() и никаких рассуждений о "стандартах" smile.gif,
прагмах, vector,....
А вообще я это серьезно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 10:46
Сообщение #10


Гуру
******

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



Цитата(zltigo @ Mar 14 2008, 10:49) *
А вообще я это серьезно.
Ээээ нет sad.gif А кто будет за него контекст сохранять и reti вместо ret делать? Это вам не ARM! biggrin.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 14 2008, 21:38
Сообщение #11


Гуру
******

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



Цитата(Сергей Борщ @ Mar 14 2008, 13:46) *
А кто будет за него контекст сохранять и reti вместо ret делать?...

Я на __interrupt не покушаюсь - это есть минимальная и достаточная необходимость, мне применение излишеств типа #pragma vector совсем не нравится.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2008, 22:34
Сообщение #12


Гуру
******

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



Цитата(zltigo @ Mar 14 2008, 23:38) *
Я на __interrupt не покушаюсь - это есть минимальная и достаточная необходимость, мне применение излишеств типа #pragma vector совсем не нравится.
Мда. Диалектика. Мне не нравится редактирование cstartup smile.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 14 2008, 22:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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)
{
Тело обработчика
}
По-моему это еще более ближе к стандарту. Дописав всего две прагмы любую стандартную функцию без аргументов можно превратить в обработчик прерывания.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 15 2008, 07:19
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


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


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