链接描述文件 - 映射非连续内存

时间:2021-03-15 09:46:58

标签: gcc ld linker-scripts

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

memory_map

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

这是我的链接脚本:

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
}

最后,我希望链接器脚本计算可用的免费 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)

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

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

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

  . = . + _unallocated_ram1;

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

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

我的问题:如何添加不计入 RAM SECTION 的内存块。换句话说,如何将 .heap2 放在 _eheap1 之后的偏移处。如何映射非连续内存。

感谢您的帮助!

0 个答案:

没有答案
相关问题