重用代码存储器来存储数据

时间:2014-06-11 21:22:19

标签: c gcc embedded ld

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

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

我已经测试了一种处理这个问题的方法:

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

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

现在我想启用lto(链接时间优化),并且由于输入节名称已更改,因此会破坏上述方法。

考虑测试新方法:

  • 将启动代码和主代码构建为两个独立的程序。每个程序都是单独构建和优化的,并组合成一个启动映像 优点是主代码不会调用意外放置在启动部分中的函数(执行主代码时不再存在)。另一个优点是我只需要为每个阶段指定入口点,链接器将完成剩下的任务,找出该阶段所需的代码和数据。
    从启动输出并由main使用的参数数据可以放在公共的bss部分或堆栈中。

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

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

1 个答案:

答案 0 :(得分:1)

我见过的方法(Rabbit处理器)正在使用叠加层。 [涉及到一些硬件,所以我不确定这个比喻是否完美。]无论如何,[在我脑海中]的概念就像电梯一样。您有少量的程序空间(电梯轿厢),它始终是安全可行的。但是如果你想访问另一个楼层,你会回到电梯(电脑就在那个小地址空间里),然后切换设置以激活另一个存储区。然后你可以离开电梯,进入新的楼层。

你有一个稍微不同的问题(想要使用更少的内存而不是没有足够的地址线),但同样的策略可能适用。

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