ARM Cortex M3上的GCC:从特定地址调用函数

问题描述 投票:2回答:1

我需要从特定地址(例如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();

换句话说,我打算将我的代码分成多个图像,从而减少每次符号或计算更改时修改或覆盖闪存的需要。

有什么建议/想法吗?

c gcc linker arm
1个回答
0
投票

您可以定义跳转表,该跳转表总是位于相同的闪存区域中(您可以在我认为的代码中在链接器和编译指示中定义该区域),并在调用时跳转到所需的函数。

在固件第一部分中,您只定义了指向“传递”函数地址的符号(如果您始终将它保存在同一区域中,它将使未来的更新变得更容易)。在固件第二部分中,您将创建跳转表,该跳转表位于您在固件第I部分中引用的地址空间中并调用实际功能。

我不是100%确定我已经正确描述了它,但这应该给你一些概念如何解决你的问题。提供的环Ø应该可以帮助您将跳转表代码放在一个地方。

© www.soinside.com 2019 - 2024. All rights reserved.