Понедельник
Oct 12 2007, 10:27
отлаживаю код для работы по прерываниям, инициализирую регистры дальше в основной программе бесконечный цикл. Проблема начилась с того, что прерывание происходит только один раз(AIC_EOICR в обработчике стираю), стал разбираться, оказалось, что после прерывания код улетает не на while (1); а на следующий адрес, т.е. перед прерыванием РС = 0х10116С, а после выхода РС = 0х101170, кстати в соответствии с адресом в регистре R14, что это, баг или руки кривые? Забыл добавить, среда Keil uVision3 компилятор GNU контроллерAT91SAM7X256.
aaarrr
Oct 12 2007, 10:31
Выход из IRQ - SUBS PC, R14, #4. Т.е. R14 действительно указывает на следующую команду.
Понедельник
Oct 12 2007, 10:34
Цитата(aaarrr @ Oct 12 2007, 14:31)

Выход из IRQ - SUBS PC, R14, #4. Т.е. R14 действительно указывает на следующую команду.
это я понял, чего делать то, вставлять в Си,вставки асм ?
вообщето это работа компилятора, как мне кажется
aaarrr
Oct 12 2007, 11:14
Сказать компилятору, что функция является обработчиком прерывания.
Для GCC что-то вроде
Код
void bla_bla_irq(void) __attribute__ ((interrupt ("IRQ")));
если не ошибаюсь.
1. Ну обработчик прерыавния должен быть правильно указан в заголовке. Для gcc это что-то типа __attribute__ ((interrupt, "IRQ")). Точно не помню, так как всегда пишу на ассемблере общий обработчик, вызывающий функции по назначению и типу прерывания.
2. Вроде как GCC был уличен в глюке по этому поводу. Опять же не могу сказать точно т.к не пользую.
aaarrr
Oct 12 2007, 11:24
Цитата(amw @ Oct 12 2007, 15:18)

2. Вроде как GCC был уличен в глюке по этому поводу. Опять же не могу сказать точно т.к не пользую.
Вот
тема про глюки GCC.