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

问题描述 投票:0回答:2

我目前正在开展一个项目,使用 RTOS (micrium) 在 STM32 微控制器中开发应用程序。
是否有任何工具可以计算 RTOS 应用程序中特定线程的堆栈使用情况?

stack stm32 microcontroller rtos micrium
2个回答
3
投票

我不知道有什么工具。然而,两种简单的方法来估计堆栈使用情况一直对我有用。

  1. 用 0x55 或 0xAA 等值填充所有 RAM。让程序运行足够长的时间,同时使用设备的所有选项以获得最大的代码执行覆盖率。停止(在某些调试器下),并检查 RAM 是否有被覆盖的上述值。这应该会给你一个很好的近似值。不管有没有操作系统,这都可以工作。

  2. 稍微修改操作系统,以便在任务切换时记录到某个全局变量(数组),并且对于每个任务,通过与同一任务的先前值进行比较找到最低的堆栈指针。按照 [1] 中的方式运行应用程序足够长的时间后,检查计数器。尽管不能保证任务切换发生时您将拥有用于该任务的最大堆栈,但从统计角度来看,经过足够长的时间并假设抢占式切换,您将设法记录足够准确的值。


1
投票

如果您使用 GCC 或 clang

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

此处所述,创建此类工具的工作已经为您完成,使用此处中的 Perl 脚本。

ARM 的

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

另请注意,在 ARM Cortex-M 上,“系统堆栈”由

main()
线程和所有 ISR 共享,如果使用 ISR 抢占优先级,则多个中断可能会同时处于活动状态。因此,理论上最坏情况下的堆栈使用量是每个 main() 和可能同时发生的所有 ISR 的堆栈使用量的
sum
。虽然保持 ISR 简短是一种很好的做法,但请注意第三方代码。例如,ST 的 USB 库在 ISR 上下文中运行整个 USB 设备堆栈!

© www.soinside.com 2019 - 2024. All rights reserved.