其实我用宏定义了256个中断向量,它们的名字就像isr_1()
,isr_2()
等等。当我想将它们的地址放入向量数组时uint32_t handlers[256]
,我遇到了一个问题,即使用宏无法帮助我解决这些问题。
#define ISR(NUM) isr_##NUM
for(int i = 0; i < 256; i ++){
handlers[i] = (uint32_t)&ISR(i);
}
但正如你所知,这是一个错误的代码。它将被扩展为:
for(int i = 0; i < 256; i ++){
handlers[i] = (uint32_t)&isr_i;
}
没有任何名为isr_i()
. 所以这是错误的。有没有办法解决这个问题?
该宏将不起作用,因为它仅在编译之前的预处理器执行期间执行简单的文本连接和替换。循环发生在运行时,因此 的值i
在预处理器阶段不可用。
我建议不要使用宏来尝试自动化这样的工作。它很难阅读并迫使您为函数提供非描述性且难以区分名称。
只需使用简单的数组字面量就可以达到相同的效果。它更清晰,因为它不需要您在阅读代码时尝试并在脑海中想象宏替换的样子。它不会强迫您使用错误的函数名称,它还允许您在源代码中搜索函数名称并查看它们的使用位置。
所以与其
typedef <your-function-sig-here> handler_type;
handler_type handlers[] =
{
isr_1,
isr_2,
isr_3
};
256 个条目代表了相当大的数组,但我认为这样做仍然值得。如果您不介意基于数字的函数名称,则不会阻止在编译器之前运行的不同工具在其自己的标头中生成数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句