如何在数据部分(RAM)中保留一系列内存并使用该内存防止同一应用程序的堆/堆栈?

时间:2014-06-09 10:49:26

标签: gcc memory-management arm microcontroller ram

我想在RAM中保留/分配一系列内存,同一应用程序不应覆盖或使用该范围的内存进行堆/堆栈存储。如何在ram中分配一系列内存以防止堆栈/堆覆盖? 我想过将一个数组添加(或分配)给应用程序本身并保留内存,但是它被编译器优化为未在应用程序中的任何地方引用。

我正在使用ARM GNU工具链进行编译。

1 个答案:

答案 0 :(得分:4)

这个问题有几种解决方案。列出最好的订单,

  1. 使用链接器
  2. 注释变量
  3. 全球范围
  4. 挥发性(可能)
  5. 链接描述文件

    显然,您可以使用链接器文件来执行此操作。这是适合这项工作的工具。传递链接器--verbose参数以查看默认脚本是什么。然后,您可以对其进行修改以精确保留内存。

    变量属性

    对于 gcc 的更新版本,attribute used也可以执行您想要的操作。 Most modern gcc版本将支持此功能。它也比链接器脚本容易得多;但只有链接描述文件能够以可靠的方式精确控制的位置。

    全球范围

    您也可以为数组提供全局范围,编译器不应该删除它。如果您使用link time optimization,则可能不是这样。

    挥发性

    理论上,编译器可以消除静态volatile数组。当你有涉及数组的代码时volatile开始发挥作用。它修改了访问行为,因此编译器永远不会缓存对该范围的访问。 Dr. Dobbs on volatile 至少我的行为不清楚,我不推荐这种方法。它可能适用于编译器的某些版本(和优化级别),而不适用于其他版本。

    限制

    此外,链接器选项-gc-sections可以消除全局范围和volatile方法保留的空间,因为符号可能无法以对象格式以任何方式注释;请参阅链接描述文件(KEEP)

    只有链接器脚本才能明确限制堆栈的重写。您需要在保留区域之前放置堆栈顶部。通常,会增长,堆栈会逐渐减少。所以这两者相互碰撞。这特别适用于您的环境/ C库(例如newlib是典型的ARM裸机库)。查看链接器文件将为此提供最佳线索。

    我猜你是否希望休闲区在发生系统崩溃时保留某些调试信息?更明确地解释你的问题会有所帮助。你似乎并不关心内存的位置,所以我猜这不是硬件相关的。