Estoy trabajando en un microcontrolador usando el lenguaje C. En este micro específica, las interrupciones tienen que ser definidos usando #pragma
en siguiente manera:#pragma dentro #define
static void func();
#pragma INTERRUPT func <interrupt_address> <interrupt_category>
static void func() { /* function body */ }
El <interrupt_address>
es la dirección de la interrupción en la tabla vector. El <interrupt_category>
es 1 o 2. Por ejemplo, para definir una interrupción en el puerto 0 pin 0:
static void _int_p00();
#pragma INTERRUPT _int_p00 0x10 1
static void _int_p00() { (*isr_p00)(); }
Definimos la rutina de servicio de interrupción real en otro lugar y el puntero de función de uso (como isr_p00
en el ejemplo) para ejecutarlos.
Sería conveniente si las interrupciones se pudieran definir utilizando una macro. Yo quiero hacer definir una macro en la siguiente forma:
#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)(); }
El compilador lanzar el siguiente error:
Formal parameter missing after '#'
indicando siguiente línea:
static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
supongo directivas del preprocesador no se pueden utilizar en #define
s? ¿Hay algún trabajo alrededor?
¿Qué microcontrolador y compilador? Si está basado en GCC, puede haber un atributo especial macro que pueda usarse, como en el C32 de Microchip: 'void __ISR (_TIMER_5_VECTOR) SomeISR (void)' – detly
El micro es OKI 431 y el compilador es de OKI: IDEU8. – Donotalo