Я работаю в микроконтроллере, использующем язык 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
с? Есть ли работа вокруг?