【问题标题】:GCC on ARM Cortex M3: Calling functions from specific addressesARM Cortex M3 上的 GCC:从特定地址调用函数
【发布时间】:2017-12-28 00:57:40
【问题描述】:

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

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

有什么建议/想法吗?

【问题讨论】:

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

标签: c gcc linker arm


【解决方案1】:

您可以定义跳转表,该跳转表将始终驻留在同一闪存区域中(您可以在链接器和我认为的代码中的编译指示中定义该区域),并在调用时跳转到所需的函数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多