在我必须理解的嵌入式代码中,有这行代码:
*((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;
答案 0 :(得分:10)
它是一个指向函数的指针。
因此,强制转换将整数0x01
转换为类型为(void (*)())
你可以改写它:
typedef void (*interrupt_handler)();
*((interrupt_handler*) 0x01) = c_int101;
答案 1 :(得分:4)
(void (**) ())
是指向函数指针的指针。
((void (*)())
是指向函数的指针,因此添加星号会增加间接级别。)
你需要说:
*((interrupt_handler*) INTERRUPT_VECTOR) = (handler)
读取,“将INTERRUPT_VECTOR
视为指向函数指针的指针,并将其值设置为handler
。”
答案 2 :(得分:2)
以下是关于该表达式核心(void (**) ())
:
将unknown_name转换为指向函数返回void
的指针
所以,它是一个强制转换(由外部括号表示),类型是“指向函数指针”,这似乎是有道理的。
答案 3 :(得分:1)
Cdecl将是更快的了解方式:
cast unknown_name into pointer to pointer to function returning void
着名的“螺旋式规则将是下一个:
+-----+
|+-+ |
|| | V
(void (** |)( ))
^ ^^|| |
| |||| |
| ||+| |
| +--+ |
+---------+
按照您阅读的文字:
答案 4 :(得分:-1)
您可以将中断入口点向量的设置可视化为
void (*interupt_handlers)()[256] = 0;
void set_interupt_handler(int vector, void(*handler)())
{
interupt_handlers[vector] = handler;
}