首页 > 解决方案 > 链接描述文件 - 映射非连续内存

问题描述

我想在我的 MCU 上以这种方式分配 RAM 内存:

内存映射

我的物理内存分为两部分,我无法分配跨越此边界的内存(由于组件的物理约束)。由于这个限制,在我的示例中,我必须将堆分成两部分。

这是我的链接器脚本:

MEMORY
{
  RAM (rw) : ORIGIN = 0x00, LENGTH = (0x200)
}

SECTION
{
  .heap1 (NOLOAD):
  {
    _heap1_size = 0x80;
    . = . + _heap1_size;
    _eheap1 = .;
  } > RAM

  .unallocated_ram1 (NOLOAD):
  {
    _unallocated_ram1 = (0x100 - ABSOLUTE(_eheap1)); /* create an offset for .heap2 */
    . = . + _unallocated_ram1;
  }

  .heap2 (NOLOAD):
  {
    _heap2_size = 0x90;
    . = . + _heap2_size;
  } > RAM
}

最后,我希望链接器脚本计算可用的可用内存。我使用--print-memory-usage链接器来打印结果。

就我而言,我希望输出为:

free_ram = total ram - (_heap1_size + _heap2_size)
free_ram =    0x200  - (   0x80     +     0x90  )
free_ram =    0xF0 (240)

但由于该unallocated_ram1部分位于 RAM 部分,链接器脚本会将其添加到 ram 大小并打印:

free_ram = total ram - (_heap1_size + unallocated_ram1 + _heap2_size)
free_ram =   0x200   - (   0x80     +        0x20      +     0x90   )
free_ram = 0xD0 (208)

我知道一个解决方案是使用命令将 heap2 放在特定地址,AT但我不想这样做,因为存在内存重叠的风险(在我的项目中有很多部分)。

我还发现.unallocated_ram1用一个简单的替换:

...
.heap1 (NOLOAD):
  {
[...]
  } > RAM

  . = . + _unallocated_ram1;

  .heap2 (NOLOAD):
  {
[...]
  } > RAM
...

不能按预期工作。它不会移动内存指针。

我的问题:如何添加不计入 RAM SECTION 的内存块。换句话说,如何.heap2_eheap1. 如何映射非连续内存。

谢谢你的帮助!

标签: gccldlinker-scripts

解决方案


推荐阅读