[STM32U5] 在 FreeRTOS 如何查看所有线程的堆栈?

[复制链接]
123|10
lvluoo 发表于 2025-11-26 13:50 | 显示全部楼层 |阅读模式

我正在使用 NUCLEO-U575ZI-Q 开发板,通过 STM32CubeIDE进行编译。我的项目基于 FreeRTOS,调试时暂停程序执行后,能在 STM32CubeIDE 左上方看到当前运行线程的堆栈跟踪,且当前执行的代码行会高亮显示。有没有办法(不一定局限于 STM32CubeIDE 内部)查看所有线程的堆栈跟踪?另外,能否高亮显示每个线程最后执行的代码行?


公羊子丹 发表于 2025-11-27 07:31 | 显示全部楼层
我之前在 U5 上用 FreeRTOS 调试时也想看所有线程的栈,后来发现 IDE 默认只展示当前线程。你可以试试把 FreeRTOS 的线程感知插件打开,有时候会多出几个有用的视图。
周半梅 发表于 2025-11-27 07:31 | 显示全部楼层
如果你想看每个任务的最后执行位置,可以考虑在任务切换的 hook 里手动记录 PC 值。FreeRTOS 有 traceTASK_SWITCHED_IN 这种宏,配合保存寄存器能做到,但需要自己扩展一点。
帛灿灿 发表于 2025-11-27 07:32 | 显示全部楼层
我以前用 Ozone 调试 J-Link 时,可以直接看到所有任务的栈使用率,还能点进去看调用栈。你可以试试看用外部调试器,体验比 CubeIDE 强不少。
童雨竹 发表于 2025-11-27 07:33 | 显示全部楼层
你检查过启用 configUSE_TRACE_FACILITY 吗?这个开了之后,FreeRTOS 会暴露更多任务状态信息,有些 IDE 插件依赖这个开关才能显示全部线程的细节。
万图 发表于 2025-11-27 07:34 | 显示全部楼层
其实也可以用 FreeRTOS+Trace 工具,把任务运行轨迹导出来,虽然不是实时栈跟踪,但能看到每个任务在哪些时间段跑过,定位问题意外地好用。
Wordsworth 发表于 2025-11-27 07:35 | 显示全部楼层
我怀疑 IDE 不能高亮所有任务的最后执行行,是因为需要保存各任务的寄存器快照,但 ST 的调试插件默认只保存当前线程。除非换 DAP 或 J-Link 类工具,不然可能做不到。
Bblythe 发表于 2025-11-27 07:36 | 显示全部楼层
有个土方法,就是在每个任务循环里主动打印 LINE 或 PC 值到 RTT 或串口,这样至少能知道最后跑到哪。虽然原始一点,但有时候比 IDE 可靠。
Pulitzer 发表于 2025-11-27 07:37 | 显示全部楼层
如果你用的是 TrustZone 工程的话,调试任务栈会更麻烦,安全区和非安全区的上下文切换会让 IDE 显示不完整,这时候要确认调试器支持 TZ 才行。
Uriah 发表于 2025-11-27 07:38 | 显示全部楼层
你可以试试把 FreeRTOS 的最小栈调低一点,然后观察栈水位,这样有时候能推断任务跑了哪些深度的函数,但这只适合分析,不是完整堆栈跟踪。
Clyde011 发表于 2025-11-27 07:39 | 显示全部楼层
另外建议看看 CubeIDE 的 EmbSysReg、FreeRTOS Task List 两个视图组合使用,有时候能同时看到堆栈基址和栈高水位,虽然算不上完整调用栈,但分析死锁时够用了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

104

帖子

0

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