首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RTOS应用程序中堆栈使用的计算

RTOS应用程序中堆栈使用的计算
EN

Stack Overflow用户
提问于 2022-01-31 22:08:47
回答 2查看 358关注 0票数 -2

我目前正在开发一个使用实时操作系统(micrium)在STM32微控制器中开发应用程序的项目。

在RTOS应用程序中是否有任何工具来计算特定线程的堆栈使用情况?

EN

回答 2

Stack Overflow用户

发布于 2022-02-01 09:52:53

我不知道什么工具。但是,估计堆栈使用情况的两种简单方法一直适用于我。

  1. 用0x55或0xAA之类的值填充所有RAM。让程序运行足够长的时间,同时使用设备的所有选项,以获得最大的代码执行覆盖率。停止(在某个调试器下),检查RAM中正在覆盖的上述值。这应该给你一个很好的近似。这适用于或不使用操作系统。
  2. 修改一下操作系统,以便在任务切换时,将记录到某个全局变量(数组),并将每个任务的最低堆栈指针与相同任务的前一个值进行比较。在运行该应用程序足够长的时间后,检查计数器。虽然不能保证任务切换发生的那一刻就会有用于该任务的最大堆栈,但从统计上讲,经过足够长的时间并假设抢占性切换,您将成功地记录了一个足够准确的值。
票数 3
EN

Stack Overflow用户

发布于 2022-02-14 12:16:34

如果使用GCC或clang,则-fstack-usage编译器开关为每个函数生成堆栈帧大小。您需要将这些信息与链接器生成的调用图信息结合起来,以找到从特定函数开始的最深的堆栈使用情况。从main()开始,任务入口点和ISR将为该线程提供最坏的使用情况。

帮助您完成了创建这样一个工具的工作,正如讨论过的这里一样,使用了来自这里的Perl脚本。

ARM的armcc编译器v5和更早版本(v6是clang/llvm)具有此功能,可以在链接映射中包含详细的堆栈分析,包括最坏情况的调用路径和不确定堆栈使用的警告(例如,由于递归或通过函数指针进行回调)。例如,如果您使用的是Keil,您可能正在使用armcc。同样,对于多线程系统(任务/ISRs),您需要查看线程入口点的堆栈使用情况。

还请注意,在ARM Cortex-M上,“系统堆栈”由main()线程和所有ISR共享,如果您使用ISR抢占优先级,多个中断可能同时处于活动状态。因此,从理论上讲,最坏情况下的堆栈使用是每个main()和所有可能并发发生的ISR的堆栈使用量之和。虽然保持ISRs的简短和简单是很好的做法,但是要小心第三方代码.例如,ST的USB库在ISR上下文中运行整个USB设备堆栈!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70933412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档