Я работаю в микроконтроллере, используя язык 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? Есть ли работа вокруг?
void __ISR(_TIMER_5_VECTOR) SomeISR(void)
- person detly   schedule 27.07.2010