【问题标题】:How to define the start address of the heap in RAMRAM中如何定义堆的起始地址
【发布时间】:2018-08-15 12:50:40
【问题描述】:

我使用的是 STM32L432KC 微控制器,它有两个独立的内部 RAM 区域(SRAM1 为 48kB,SRAM2 为 16kB)。内存范围不相邻,因此无法将它们作为一个 64kB 的块来使用。

在默认链接描述文件中,所有数据包括。堆和栈位于 SRAM1 中,而 SRAM2 未使用。现在我想在 SRAM2 中定位堆和堆栈。但是,无法理解如何告诉链接器堆的位置。

我发现了一条语句“在 BSS 段之后分配了 HEAP”,并且我发现了一些提示,即堆从“结束”符号开始。链接器没有明确的符号来定位堆吗?

我在地图文件中发现了一个符号“__malloc_sbrk_start”,但这似乎有所不同(Google 没有帮助)。

【问题讨论】:

  • 什么工具链?
  • 工具链是“Ac6 STM32 MCU GCC”(STM32 的 SystemWorkbench)。叫我笨蛋,但我找不到任何版本信息。
  • 所以您使用的是 GNU 编译器?链接器有据可查。您是否尝试过从默认链接器脚本开始并对其进行修改?
  • heap 和 sbrk 来自 C 库而不是工具链。它在库中的 malloc 实现背后。

标签: heap-memory stm32 cortex-m linker-scripts


【解决方案1】:

您只需要修改链接描述文件。幸运的是,我找到了您设备的 AC6 工具链链接器脚本。

内存映射是

MEMORY
{
FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 256K
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 48K
SRAM2 (rw)      : ORIGIN = 0x10000000, LENGTH = 16K
}

要将堆和堆栈移动到SRAM2,请修改

/* Highest address of the user mode stack */
_estack = 0x2000c000;    /* end of RAM */

/* Highest address of the user mode stack */
_estack = 0x10004000;    /* end of RAM */

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >SRAM2

为什么会这样: PC 在 startup_stm32l432xx.s 中加载,符号为 _estack。并在syscalls.c 中按符号end 进行堆定位。

【讨论】:

    【解决方案2】:

    只需在链接描述文件中搜索符号__malloc_sbrk_start,就会出现__malloc_sbrk_start = .; 之类的内容(它将位于RAM 中所有已定义段的末尾),只需将. 替换为SRAM2 的起始地址,以防万一您的 MCU:__malloc_sbrk_start = 0x10000000;

    【讨论】:

      猜你喜欢
      • 2020-01-02
      • 2019-07-17
      • 2014-01-30
      • 2015-09-23
      • 2014-11-29
      • 2015-03-22
      • 2015-07-28
      • 2013-05-14
      • 2021-12-04
      相关资源
      最近更新 更多