我使用的是STM32L432KC微控制器,它有两个独立的内部RAM区域(SRAM1为48kB,SRAM2为16kB)。内存范围不相邻,因此无法将它们用作64kB的单个块。
在默认链接描述文件中包含所有数据。堆和堆栈位于SRAM1中,而SRAM2未使用。现在我想在SRAM2中找到堆和堆栈。但是,无法理解如何告诉链接器应该在哪里找到堆。
我发现了一个声明" HEAP是在BSS段之后分配的#34;我发现了一些提示,堆开始于" end"符号。是不是有一个显式符号供链接器找到堆?
我找到了一个符号" __ malloc_sbrk_start"在地图文件中,但这看起来是不同的(谷歌没有帮助)。
答案 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
堆积位置。