指向ROM中的function

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

# define Device_cal (void(*)(void))0x3D7C80 

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

 (*Device_cal)() 

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

#define导致(*Device_cal)()在编译之前立即扩展到此:

 (*(void(*)(void))0x3D7C80)() 

void(*)(void)是一个函数指针的声明,它接受void并返回void类型。 (*())表示表达式中下一个标记的0x3D7C800x3D7C80 )。 因此,这要求将位置0x3D7C80处的数据视为一个函数。 final ()调用没有参数的函数。

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

(void(*)(void)) 0x3D7C800x3D7C80整数转换为此函数指针。

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

(Device_cal)()将完全相同。

*Device_calDevice_cal周围的括号是必需的,否则对整数的*Device_cal Device_cal将不具有更高的优先级。

好吧,你“定义”一个指向函数的指针,然后调用它。 void(*)(void)表示指向函数的指针,它不带参数,并返回void 。 如果将0x3D7C80转换为该类型并调用它,则基本上调用其地址为0x3D7C80的函数。

这不是一个答案(已经令人满意地完成),但有些建议:

我建议使用以下方法:

 typedef void (*tVOID_ROMFUNCTION_VOID)( void ) ; tVOID_ROMFUNCTION_VOID Device_cal = (tVOID_ROMFUNCTION_VOID)0x3D7C80 ; Device_cal() ; 

这样,您可以在初始化时创建任意数量的全局函数指针,而调用看起来像普通的静态链接函数。 并且您可以避免同时混淆预处理器宏voodoo。

通过创建具有不同签名的不同函数指针类型,编译器也可以为您执行一些参数类型检查。

粘贴符号,在其中创建一个指向固定内存位置的函数的临时(未命名)指针,然后通过解除引用来调用它。