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

ARM Cortex M3上的GCC:从特定地址调用函数,c,gcc,linker,arm,C,Gcc,Linker,Arm,我需要从特定地址(例如)调用函数,但不完全相同。我可以从映射表中提取指针并操作动态生成的函数指针,这是我宁愿避免的。例如,我想避免这种类型的呼叫: ((int)(*)(void*)) compute_volume = ((int)(*)(void*)) 0x20001000; int vol = (*compute_volume)(); 相反,我更愿意使用某种链接器提供的符号或其他方法来实现以下功能,除了compute\u volume()函数由不同的映像提供,可能类似于以下内容: exte

我需要从特定地址(例如)调用函数,但不完全相同。我可以从映射表中提取指针并操作动态生成的函数指针,这是我宁愿避免的。例如,我想避免这种类型的呼叫:

((int)(*)(void*)) compute_volume = ((int)(*)(void*)) 0x20001000;

int vol = (*compute_volume)();
相反,我更愿意使用某种链接器提供的符号或其他方法来实现以下功能,除了
compute\u volume()
函数由不同的映像提供,可能类似于以下内容:

extern int compute_volume(void);

vol = compute_volume();
换句话说,我打算将代码拆分为多个图像,从而减少每次符号或计算更改时修改或覆盖flash的需要


有什么建议/想法吗?

您可以定义跳转表,该跳转表将始终位于同一闪存区域(我认为您可以在链接器中定义该区域,并在代码中定义pragmas)中,当调用该跳转表时,跳转到所需的函数

在固件第一部分中,您只定义了表示“传递”函数地址的符号(如果您始终将其保持在同一区域,则将来的更新将更加容易)。在固件第二部分中,创建跳转表,该跳转表位于固件第一部分中提到的地址空间中,并调用实际函数


我不是100%确定我描述的是否正确,但这应该会让你知道如何解决你的问题。提供的链接环Ø应该可以帮助您将跳转表代码放在一个位置。

函数指针就是为此而设计的。但是,如果语法让您感到困扰,在这种情况下,您可以使用
#define
或或注意,与每次重写整个闪存相比,这不会给您更多的更新周期,因为微控制器闪存没有磨损均衡。