Как объявить обработчик прерывания (ISR) в Mspgcc?
Каков предпочтительный метод объявления обработчика прерываний в mspgcc?
2 ответа
Просто чтобы уточнить, потому что это ранний результат Google.
__attribute__((__interrupt__(TIMER0_A0_VECTOR)))
void __isr_5(void)
{
...
}
Текущий GCC все еще (я полагаю, что это то, что прокомментировал arvindpdmn) вызывает ошибку, когда использует вышеупомянутый синтаксис.
internal compiler error: in msp430_attr, at config/msp430/msp430.c:1835
{
^
Проблема была поднята для этого после сообщения об этом в сообществе TI E2E, но сказал, что проблема все еще находится в состоянии "Запланировано", и неясно, кому принадлежит этот трекер. (Вы можете получить доступ к проблеме через ссылку выше).
Глядя на код, ошибка, по-видимому, возникает, потому что единственным атрибутом, который может иметь аргументы, является interrupt
приписывать.
На самом деле, компиляция работает нормально, если пропущены первые и нижние подчеркивания.
Это правильный синтаксис!
__attribute__((interrupt(TIMER0_A0_VECTOR)))
void name_does_not_matter(void)
{
...
}
И действительно, этот атрибут задокументирован в официальной документации GNU GCC. Оглядываясь назад, довольно непонятно, откуда появились подчеркивания. Таким образом, в основном, единственная проблема здесь в том, что сообщение об ошибке является настолько неинформативным.
Обратите внимание, что эта информация относится к MSPGCC v4.6.3, который предшествует порту Ti/Redhat/SOMNIUM MSPGCC, который теперь распространяется вместе со студией Code Composer Studio.
Спасибо за этот ответ Питеру Биготу из списка рассылки Mspgcc-users.
Есть две возможности:
А. Используйте синтаксис студийного стиля Code composer (обладает дополнительным преимуществом переносимости в CCS):
#pragma vector=TIMER0_A0_VECTOR
__interrupt void
ta0cc0_isr (void)
(Обратите внимание, что это было введено где-то около версии 20120406 Mspgcc).
Б. Используйте собственный синтаксис gcc:
static void
__attribute__((__interrupt__(TIMER0_A0_VECTOR)))
isr_cc0_TA0 (void)
C. Назовите функцию правильно, чтобы она была включена в таблицу векторов (полезно для функций ASM).
Атрибут прерывания вызывает имя функции __isr_X
где X - смещение слова прерывания от начала таблицы векторов (равно значению параметра атрибута прерывания, деленному на 2).
Эти __isr_X
символы используются для инициализации таблицы векторов в crt0ivtbl.o.