Don*_*alo 10 c microcontroller c-preprocessor
我正在使用C语言在微控制器中工作.在这个特定的微观中,必须使用#pragma
以下方式定义中断:
static void func();
#pragma INTERRUPT func <interrupt_address> <interrupt_category>
static void func() { /* function body */ }
Run Code Online (Sandbox Code Playgroud)
该<interrupt_address>
是向量表的中断地址.的<interrupt_category>
是1或2.例如,以限定在端口的中断0销0:
static void _int_p00();
#pragma INTERRUPT _int_p00 0x10 1
static void _int_p00() { (*isr_p00)(); }
Run Code Online (Sandbox Code Playgroud)
我们在别处定义实际的中断服务程序,并使用函数指针(如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)(); }
Run Code Online (Sandbox Code Playgroud)
编译器抛出以下错误:
Formal parameter missing after '#'
Run Code Online (Sandbox Code Playgroud)
指示以下行:
static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
Run Code Online (Sandbox Code Playgroud)
我想预处理器指令不能在#define
s中使用?有什么工作吗?
Jen*_*edt 13
C99具有_Pragma
允许您放置#pragma
在宏内的新关键字.基本上它需要一个字符串作为参数,该参数对应于您将赋予该#pragma
指令的文本.
如果你的编译器不支持这个(gcc没有)并且你需要外部实现你需要的东西(如上所述,m4
可能是一个选择),那么最好的可能就是尽可能地保持不那么接近. - 新的_Pragma
.然后,一旦您的编译器构建器赶上标准,您就可以停止使用您的脚本.