指向ROM中的功能

mhl*_*mhl 5 c embedded

我有微控制器,我正在与他合作.在调试时,必须调用一个在ROM中硬编码的函数.技术参考显示了如何执行此操作:

# define Device_cal (void(*)(void))0x3D7C80
Run Code Online (Sandbox Code Playgroud)

和调用过程看起来像这样:

(*Device_cal)()
Run Code Online (Sandbox Code Playgroud)

我无法理解这里究竟发生了什么,所以我的问题是:它是如何工作的?

oua*_*uah 7

void (*) (void)是一种类型.它是一个指向函数的指针,它不带参数并返回void.

(void(*)(void)) 0x3D7C800x3D7C80整数强制转换为此函数指针.

(*Device_cal)() 调用该函数.

(Device_cal)() 会做同样的事情.

围绕*Device_cal和括号Device_cal是必需的,否则对整数的强制转换将不具有更高的优先级.


sar*_*old 3

编译前立即展开的#define原因:(*Device_cal)()

(*(void(*)(void))0x3D7C80)()
Run Code Online (Sandbox Code Playgroud)

这是一个接受和返回类型void(*)(void)的函数指针的声明。表示表达式 ( ) 中下一个标记的强制转换。因此,这要求将位置处的数据视为函数。最终调用不带参数的函数。voidvoid(*())0x3D7C800x3D7C80()