STM32 的 SRAM 运行段和堆栈怎么划分?

STM32 · 9 浏览
STM32 的 SRAM 运行段和堆栈怎么划分?

回答(4)

调试时用`__get_MSP()`读栈指针,配合map文件看实际使用峰值,再调栈大小。别拍脑袋定,实测最准。
硬件阿强 · 2026-08-20
注意F4系列有CCM RAM,只能CPU访问,不能DMA。如果放堆栈进去,得确认外设不用它,否则数据会莫名丢失。
码农小刘 · 2026-08-20
我一般把栈放最后(高地址),因为栈向下长,和堆冲突时容易察觉。堆别开太大,很多项目根本不用malloc,直接静态分配更稳。
嵌入式老张 · 2026-08-20
在STM32中,SRAM划分通常通过链接脚本(如GCC的.ld文件或Keil的.sct)实现。典型布局:从低地址到高地址依次为.data(已初始化全局变量)、.bss(未初始化全局变量)、堆(heap)和栈(stack)。堆栈大小需在启动文件或链接脚本中定义,例如GCC中通过`_Min_Heap_Size`和`_Min_Stack_Size`宏设置。实操建议:1) 栈向下增长,堆向上增长,两者之间留出保护间隙,防止溢出;2) 用`__attribute__((section(".bss")))`将大数组放入外部SRAM(如F407的CCM),但注意DMA访问限制;3) 在启动文件里检查栈顶指针(如`__initial_sp`)是否越界,可加看门狗或栈填充模式(0xCC)检测溢出。建议堆大小设为总SRAM的10-20%,栈按任务深度估算,避免浪费。
mcuku 阿沐 · 2026-08-20