Как объявить обработчик прерывания (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.

Другие вопросы по тегам