我正在使用 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
中使用?有什么工作吗?
答案 0 :(得分:12)
C99有一个新的_Pragma
关键字,可让您将#pragma
置于宏中。基本上它需要一个字符串作为参数,该参数对应于您将赋予#pragma
指令的文本。
如果你的编译器不支持这个(gcc没有)并且你需要外部实现你需要的东西(如上所述,m4
可能是一个选择),最好的可能就是保持尽可能接近不那么新的_Pragma
。然后,一旦您的编译器构建器赶上标准,您就可以停止使用您的脚本。
答案 1 :(得分:1)
workround是使用代码生成或其他宏语言来预处理代码。
即用不同的扩展名编写代码。
让您的makefile或类似函数调用宏语言(例如m4)或某种形式的脚本来生成.c文件
然后编译。
答案 2 :(得分:0)
据我所知,你特别提出的问题是不可能的。我假设一个预处理器与GNU C Preprocessor的工作方式相同。在手册中,it states:
编译器不会重新标记预处理器的输出。每个预处理令牌都成为一个编译器令牌。