Gui*_*i13 4 c typedef function-pointers interrupt
在我必须理解的嵌入式代码中,有这一行代码:
*((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */
Run Code Online (Sandbox Code Playgroud)
我可以掌握使用函数指针设置中断向量这一事实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 );
Run Code Online (Sandbox Code Playgroud)
但嵌入式编译器抱怨LHS不是一个对象.
有谁知道这个符号表示什么? (void (**)())
//编辑:
对于那些感兴趣的人,我会更好地理解这一点:
*( (void (*)())* 0x01) = c_int01;
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 10
它是一个指向函数的指针.
因此,强制转换将整数转换为0x01具有类型的函数指针的地址(void (*)())
你可以改写它:
typedef void (*interrupt_handler)();
*((interrupt_handler*) 0x01) = c_int101;
Run Code Online (Sandbox Code Playgroud)
(void (**) ())是一个指向函数指针的指针。
((void (*)())是指向函数的指针,因此添加星号会增加间接级别。)
你需要说:
*((interrupt_handler*) INTERRUPT_VECTOR) = (handler)
Run Code Online (Sandbox Code Playgroud)
其内容为:“将其视为INTERRUPT_VECTOR指向函数指针的指针,并将其值设置为handler”。