如何在RAM中定义堆的起始地址

时间:2018-03-07 12:07:45

标签: heap stm32 cortex-m linker-scripts

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

在默认链接描述文件中包含所有数据。堆和堆栈位于SRAM1中,而SRAM2未使用。现在我想在SRAM2中找到堆和堆栈。但是,无法理解如何告诉链接器应该在哪里找到堆。

我发现了一个声明" HEAP是在BSS段之后分配的#34;我发现了一些提示,堆开始于" end"符号。是不是有一个显式符号供链接器找到堆?

我找到了一个符号" __ malloc_sbrk_start"在地图文件中,但这看起来是不同的(谷歌没有帮助)。

2 个答案:

答案 0 :(得分:1)

只需在链接描述文件中搜索符号__malloc_sbrk_start,就会出现类似__malloc_sbrk_start = .;的内容(它将位于RAM中所有已定义段的末尾),只需将.替换为__malloc_sbrk_start = 0x10000000;即可。在MCU的情况下启动SRAM2的地址:.container { background-color: green; border: solid 1px black; } .container div { float: left; width: 20%; background-color: lightgreen; }

答案 1 :(得分:0)

您只需修改链接描述文件即可。幸运的是,我找到了适用于AC6工具链的设备的链接描述文件。

记忆图是

Empty

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

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

/* 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

为什么会这样: PC已加载到 /* 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 ,符号为startup_stm32l432xx.s。并在_estack中按符号end堆积位置。