vscode + cmake + stm32Cubeide 工程:内存分配
·
编译工程后在OUTPUT打印中可以看到:
如何理解当期RAM的使用和分配情况呢?
在启动文件.s中可以看到,栈顶定义为_estack: 
搜索连接脚本STM32G431XX_FLASH.ld,看到当前栈顶定义在最高地址:
RAM中其他内容分配情况:
RAM段包含了data,bss和预先分配的堆空间。由于定义了_estack被分配在内存的最高地址0x20005800,可在.map中查看:
从新设计stack位置,将其放在heap之后,并在二者之间做一个缓冲区(定义顺序很重要!):
/* 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;
. = ALIGN(8);
} >RAM
/* 缓冲区域(保护间隙) */
.stack_buffer :
{
. = ALIGN(8);
. = . + 0x100; /* 256 字节缓冲,可根据需要调整 */
. = ALIGN(8);
} >RAM
/* 栈区(紧跟在缓冲之后) */
.stack :
{
. = ALIGN(8);
__StackLimit = . ; /* 栈底(低地址) */
. = . + _Min_Stack_Size ;
. = ALIGN(8);
__StackTop = . ; /* 栈顶(高地址) */
} >RAM
重新定义_estack:
/* ============================================================ */
/* 在 SECTIONS 块之后,文件末尾定义 _estack */
/* ============================================================ */
_estack = __StackTop;
再次编译可以看到输出:
此时stack已经分配在RAM中。再查看map文件:

新的内存结构分配完成。内存顶部0x20005800到栈顶0x200040e8还有约6k剩余空间。
更多推荐



所有评论(0)