[STM32F4] STM32CubeIDE生成的链接器脚本中STACK(栈)与HEAP(堆)的分离问题

[复制链接]
605|11
咚了个咚 发表于 2025-9-20 12:08 | 显示全部楼层 |阅读模式

一个关于STM32CubeIDE生成的链接器脚本的通用问题。
大多数情况下,STACK(栈)和HEAP(堆)会被放置在"同一块"内部SRAM中(可通过.user_heap_stack段示例进行演示说明)。

._user_heap_stack :

{

  . = ALIGN(8);

  PROVIDE ( end = . );

  PROVIDE ( _end = . );

  . = . + _Min_Heap_Size;

  . = . + _Min_Stack_Size;

  . = ALIGN(8);

} > RAM_D1


我想将一些关键数据、静态变量等以及栈指针放入DTCRAM区域。应用程序中堆的使用并不频繁,因此将其放入速度较慢的区域,例如RAM_D2/3。

感觉是可行的吧?

如果这样做,我认为可以移除链接器脚本中的". = . + _Min_Stack_Size;"语句,现在栈与堆已分离了?

我认为还需要修改sbrk()函数,这是malloc调用的基础部分,因为存在一些与栈处理相关的链接器符号依赖。这样理解对不?

是否有示例来处理这种栈与堆分离?



公羊子丹 发表于 2025-9-21 07:13 | 显示全部楼层
栈和堆分离是可行的,关键在链接脚本和启动文件要一起改。
周半梅 发表于 2025-9-21 07:14 | 显示全部楼层
确实要把 _Min_Stack_Size 去掉,不然会被 IDE 生成的符号干扰。
帛灿灿 发表于 2025-9-21 07:15 | 显示全部楼层
堆放在 D2 RAM,栈放 DTCM RAM,是常见的性能优化方法。
童雨竹 发表于 2025-9-21 07:16 | 显示全部楼层
sbrk() 必须改,不然 malloc 还是会往默认 RAM 段里申请内存。
万图 发表于 2025-9-21 07:17 | 显示全部楼层
你要注意 FreeRTOS 这种 RTOS 自己有堆管理,要对应调整。
Wordsworth 发表于 2025-9-21 07:18 | 显示全部楼层
栈位置改了的话,启动汇编里的 MSP 初始化也得跟着改。
Bblythe 发表于 2025-9-21 07:19 | 显示全部楼层
如果是初次接触,建议先用官方 demo 熟悉整个流程。
Pulitzer 发表于 2025-9-21 07:20 | 显示全部楼层
调试过程里日志输出算清晰,但遇到 bug 还是要自己排查。
Uriah 发表于 2025-9-21 07:20 | 显示全部楼层
对比 TensorFlow Lite Micro,ST 的工具链更贴近硬件优化。
Clyde011 发表于 2025-9-21 07:24 | 显示全部楼层
不知道楼主用的是 PC 版还是在线版?两者体验也不太一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

66

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部