c - 为数据重用代码内存

标签 c gcc embedded ld

我有一些在内存有限的系统上运行的 C 代码。 代码执行基本上有两个阶段,启动阶段和主要阶段。 启动阶段包含生成主阶段使用的一些参数的代码。在主要阶段生成数据。

由于启动阶段只运行一次,所以我想将启动代码使用的内存空间重新用于主阶段的数据存储。

我已经测试了一种处理方法:

  • 自定义链接描述文件,将与启动阶段相关的代码和数据放在 .startup 部分中。该部分与 .bss 位于同一地址,这是主阶段使用的 bss 部分。
    启动代码调用启动阶段的入口点以及何时 它返回,在主阶段调用 main 之前,它清除了 .bss 部分。
    Xrossref 命令在链接描述文件中使用,以帮助将代码和数据放到正确的位置。

这可行,但它有它的怪癖。要在 .startup 部分中获取启动代码和数据,我必须将它们与 gcc 在编译期间给出的输入部分名称一起列出。

现在我想启用 lto(链接时间优化),这会破坏上述方法,因为输入部分名称已更改。

考虑测试一种新方法:

  • 将启动代码和主代码构建为两个独立的程序。每个程序都是单独构建和优化的,然后放在一个启动镜像中。
    优点是不存在主代码调用意外放置在启动部分的函数(执行主代码时不再存在)的风险。另一个优点是我只需要为每个阶段指定入口点,链接器将完成其余的工作,找出该阶段所需的代码和数据。
    startup输出的main使用的参数数据,可以放在普通的bss段,也可以放在栈上。

缺点是我看不到启动代码和主代码如何共享两个阶段使用的函数。如果共享函数很小,尝试共享它们可能不是一个好主意,因为 lto 将受到更多限制或最终内联两个版本的共享函数。

有没有人知道对此的首选方法或对新建议的方法有任何评论?

最佳答案

我见过的方法(Rabbit 处理器)是使用覆盖。 [涉及到一些硬件,所以我不确定这个类比是否完美。]无论如何,这个概念 [在我看来] 就像一部电梯。你有少量的程序空间(电梯笼),它在任何时候都是安全和可行的。但是如果你想进入另一个“楼层”,你回到电梯(PC 在那个小地址空间)然后切换设置以激活另一组内存。然后您就可以离开电梯并到达新的楼层。

您的问题略有不同(想要使用更少的内存而不是没有足够的地址行)但可以应用相同的策略。

从电梯开始。运行第一个启动代码,设置某些数据值,也可能在安全区域。退回电梯。覆盖启动代码空间。现在你可以离开电梯了。但是您仍然需要新空间的地址。这些需要存储在某个地方。也许您有两组函数指针,地址重叠,一组用于启动,另一组用于主代码。只需在正确的时间使用正确的功能即可。

关于c - 为数据重用代码内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24172802/

相关文章:

c - 显示 C 文件中的所有函数

c - 导致段错误的原因是什么?我使用gcc来编译

c++ - 错误 : '_hypot' was not declared in this scope

linux - 如何使用 Yocto 将文件部署到/boot 分区

linux - 理解Linux内核中的异常

c - 如何在没有相同引用的情况下将文本文件中的字符串存储在 C 中?

c++ - 是否有人将 Maven/NAR 用于任何大型 C/C++ 项目?

C 中嵌套 for 循环中的条件不起作用

linux - MATLAB 无效的 MEX 文件错误 : missing symbol invalid_argument

assembly - 软件看门狗定时器复位 MPC875 CPU 过快