【发布时间】:2013-04-29 10:37:25
【问题描述】:
在我必须理解的嵌入式代码中,有这行代码:
*((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */
我可以理解您使用函数指针c_int01 设置中断向量的事实,但我不知道(void (**) ()) 指的是哪种类型的转换。我知道标准函数指针符号(void (*)()),但不知道另一个。
我尝试重构代码,使其看起来更具可读性,如下所示:
// header
typedef void (*interrupt_handler)(); // prototype of an interruption handler
#define INTERRUPT_VECTOR 0x01
#define SET_INTERRUPT_HANDLER( handler ) *((interrupt_handler) INTERRUPT_VECTOR) = (handler)
// code
SET_INTERRUPT_HANDLER( c_int01 );
但是嵌入式编译器抱怨 LHS 不是一个对象。
有人知道这个符号是什么意思吗? (void (**)())
// 编辑:
对于那些感兴趣的人,我会更好地理解这一点:
*( (void (*)())* 0x01) = c_int01;
【问题讨论】:
-
它是一个指向函数指针的指针。
-
MAAANNN,我怎么没看到……我明白了。
-
除非您的平台有
sizeof(void(*)()) == 1或向量表从奇数地址开始,否则0x01不可能是正确的。 -
我确认,
sizeof(char) == sizeof(int) == 1 == 32bits在我的平台上(嵌入式 DSP)。
标签: c function-pointers typedef interrupt