Я работаю в микроконтроллере, используя язык C. В этом конкретном микроре прерывания должны быть определены с помощью #pragma
следующим образом:
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? Есть ли работа вокруг?