Хотел сделать FIQ на Си под CrossWorks1.7 build 9. Сперва сделал IRQ для прерывания от АЦП. Всё заработало с первого раза. Потом решил переделать на FIQ. Долго трах..ся, но поведение уже отлаженной программы было каким-то безумным. Через несколько часов залез в ассемблерный листинг и вижу там глюк. Прикладываю фотки пролога и эпилога прерывания. На эпилоге видно, что вместо загрузки PC (для переключения режима) почему-то загружается LR, из-за чего управление не возвращается из FIQ, а проц продолжает исполнять всякий мусор после этого эпилога.
На картинке 1 -пролог, на картинке 2 - эпилог. Оптимизация = level 1.
прототип прерывания объявлен как
void AdcIntr() __attribute__((interrupt ("FIQ")));
--------
Щас заменил __attribute__((interrupt ("FIQ"))) на __attribute__((interrupt ("IRQ"))) и тот же глючный эпилог остался. Ничего не понимаю. Может что-то ещё нужно указывать? Как с инлайном например - одного атрибута __attribute__((always_inline)) недостаточно, необходимо ещё __inline перед прототипом приписывать, иначе прога зависает. Пока детально не изучал почему так.
Сообщение отредактировал GetSmart - Sep 16 2009, 15:56
Эскизы прикрепленных изображений