【问题标题】:Using external and internal memory for heap将外部和内部内存用于堆
【发布时间】:2021-04-23 18:16:03
【问题描述】:

我已经在我的项目中连接了外部 SRAM 存储器。我想要做的是在运行时使用 malloc() 将数据存储在外部或内部存储器中。如何在代码执行期间决定在哪个内存中使用 malloc 存储堆数据?我知道我必须编辑链接器脚本,但之后它将所有堆数据存储在外部存储器中。 是否有任何链接器命令可以说在外部或内部存储器中分配下一个 malloc()?对于堆栈数据,我们可以使用 attribute((section("name"))) 变量属性,但是堆有什么东西吗?

谢谢!

【问题讨论】:

  • 对于堆栈数据,我们可以使用属性((section("name"))) - 这不是真的。您只能将其用于静态变量。堆栈变量将堆栈。如果您想要特定的 malloc 行为,则必须相应地实现分配器。

标签: memory memory-management arm stm32


【解决方案1】:

C 库中的malloc 通常只能使用一个位置的内存。如果你使用 newlib,那么它会使用_sbrk 找到这个内存。 default implementation of _sbrk 取决于链接描述文件对符号 end_end 的定义,但您也可以实现自己的。

您必须选择一个位置供malloc 访问,并使用您自己的自定义函数从其他位置分配内存。

许多库和 RTOS 实现都是这样做的。参见例如mem_malloc in LwIPrt_alloc_mem in Keil RTX

您可以使用多种方案来决定使用哪个内存,例如为特定目的使用固定大小的块池。我倾向于为malloc 使用最快的内部SRAM,因为它会变得非常分散。然后,我确保仅将 malloc 用于小事情,然后将自定义函数用于更大的分配。

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2022-11-04
    • 2011-12-03
    相关资源
    最近更新 更多