我目前正在开发一个使用实时操作系统(micrium)在STM32微控制器中开发应用程序的项目。
在RTOS应用程序中是否有任何工具来计算特定线程的堆栈使用情况?
发布于 2022-02-01 09:52:53
我不知道什么工具。但是,估计堆栈使用情况的两种简单方法一直适用于我。
发布于 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设备堆栈!
https://stackoverflow.com/questions/70933412
复制相似问题