Я работаю в микроконтроллере, используя язык C. В этом конкретном микро, прерывания должны быть определены с помощью #pragma
в следующим образом:# прагма внутри #define
static void func();
#pragma INTERRUPT func <interrupt_address> <interrupt_category>
static void func() { /* function body */ }
<interrupt_address>
является адрес прерывания в таблице векторов. <interrupt_category>
либо 1 или 2. Например, чтобы определить прерывание в Порт 0 штифтом 0:
static void _int_p00();
#pragma INTERRUPT _int_p00 0x10 1
static void _int_p00() { (*isr_p00)(); }
Определим фактическую процедуру обслуживания прерывания в другом месте и использовать указатель на функцию (например, isr_p00
в данном примере), чтобы выполнить их.
Было бы удобно, если бы прерывания могли быть определены с использованием макроса. Я хочу сделать определить макрос следующим образом:
#define DECLARE_INTERRUPT(INT_NAME, INT_CAT) \
static void _int_##INT_NAME(); \
#pragma INTERRUPT _int_##INT_NAME INT_NAME##_ADDR INT_CAT \
static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
Компилятор бросает следующее сообщение об ошибке:
Formal parameter missing after '#'
указывает на следующую строку:
static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
Я думаю директивы препроцессора не могут быть использованы в #define
s? Есть ли какая-нибудь работа?
Какой микроконтроллер и компилятор? Если он основан на GCC, может существовать специальный атрибут macro yo, который можно использовать, например, в C32 для Microchip: 'void __ISR (_TIMER_5_VECTOR) SomeISR (void)' – detly
Микро - это OKI 431, а компилятор - из OKI: IDEU8. – Donotalo