ARM Cortex M3上的GCC:从特定地址调用函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM Cortex M3上的GCC:从特定地址调用函数相关的知识,希望对你有一定的参考价值。
我需要从特定地址(例如Double function indirection in C)调用函数,但不完全相同。我可以从映射表中提取指针并操纵动态生成的函数指针,我宁愿避免使用它们。例如,我想避免这种类型的电话:
((int)(*)(void*)) compute_volume = ((int)(*)(void*)) 0x20001000;
int vol = (*compute_volume)();
相反,我宁愿使用某种链接器提供的符号或其他方法来实现以下功能,除了compute_volume()
函数由不同的图像提供,可能是这样的:
extern int compute_volume(void);
vol = compute_volume();
换句话说,我打算将我的代码分成多个图像,从而减少每次符号或计算更改时修改或覆盖闪存的需要。
有什么建议/想法吗?
答案
您可以定义跳转表,该跳转表总是位于相同的闪存区域中(您可以在我认为的代码中在链接器和编译指示中定义该区域),并在调用时跳转到所需的函数。
在固件第一部分中,您只定义了指向“传递”函数地址的符号(如果您始终将它保存在同一区域中,它将使未来的更新变得更容易)。在固件第二部分中,您将创建跳转表,该跳转表位于您在固件第I部分中引用的地址空间中并调用实际功能。
我不是100%确定我已经正确描述了它,但这应该给你一些概念如何解决你的问题。提供的环Ø应该可以帮助您将跳转表代码放在一个地方。
以上是关于ARM Cortex M3上的GCC:从特定地址调用函数的主要内容,如果未能解决你的问题,请参考以下文章