指向ROM中的function
我有微控制器,我正在与他合作。 调试时,必须调用ROM中硬编码的函数。 技术参考显示了如何执行此操作:
# define Device_cal (void(*)(void))0x3D7C80
和调用过程看起来像这样:
(*Device_cal)()
我无法理解这里究竟发生了什么,所以我的问题是:它是如何工作的?
#define
导致(*Device_cal)()
在编译之前立即扩展到此:
(*(void(*)(void))0x3D7C80)()
void(*)(void)
是一个函数指针的声明,它接受void
并返回void
类型。 (*())
表示表达式中下一个标记的0x3D7C80
( 0x3D7C80
)。 因此,这要求将位置0x3D7C80
处的数据视为一个函数。 final ()
调用没有参数的函数。
void (*) (void)
是一种类型。 它是一个指向函数的指针,该函数不带参数并返回void
。
(void(*)(void)) 0x3D7C80
将0x3D7C80
整数转换为此函数指针。
(*Device_cal)()
调用该函数。
(Device_cal)()
将完全相同。
*Device_cal
和Device_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。
通过创建具有不同签名的不同函数指针类型,编译器也可以为您执行一些参数类型检查。
粘贴符号,在其中创建一个指向固定内存位置的函数的临时(未命名)指针,然后通过解除引用来调用它。