【发布时间】:2010-07-27 05:20:49
【问题描述】:
我正在使用 C 语言在微控制器中工作。在这个特定的 micro 中,必须使用#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)(); }
我猜预处理器指令不能在#defines 中使用?有什么解决办法吗?
【问题讨论】:
-
什么微控制器和编译器?如果它是基于 GCC 的,可能会有一个特殊的属性宏可以使用,比如在 Microchip 的 C32 中:
void __ISR(_TIMER_5_VECTOR) SomeISR(void) -
micro是OKI 431,编译器来自OKI:IDEU8。
标签: c c-preprocessor microcontroller