FreeRtos 或 TI rtos 中堆栈大小的计算

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

最近我正在使用 FreeRTOS 并创建了一些任务来执行我所需的操作。虽然似乎每次我使用

xTaskCreate()
或 TI GUI 配置创建新任务时,我只是尝试将堆栈大小保持为所需的大小,以免堆栈溢出。

有什么方法可以计算我的任务对于以下事件使用的最大堆栈大小吗?

  1. 全局变量和局部变量使用的堆栈
  2. 函数最大递归次数使用的栈
  3. 包括中断上下文切换
stack rtos freertos
2个回答
5
投票

编译器、编译器优化级别、CPU架构、局部变量分配和函数调用嵌套深度都对堆栈大小有很大影响。 RTOS 的影响很小。例如,FreeRTOS 会向 Cortex-M 上的堆栈添加大约 60 个字节,用于在任务未运行时存储任务的上下文。无论您在非 RTOS 项目中使用哪种方法来计算堆栈使用情况,也都可以在您的 RTOS 项目中使用 - 然后添加大约 60 个字节。

您可以计算这些事情,这在安全关键型应用程序中可能很重要,但在其他情况下,更务实的方法是尝试并查看 - 使用 RTOS 的功能来测量实际使用了多少堆栈,并使用堆栈溢出检测 - 然后进行调整,直到找到最佳值。 http://www.freertos.org/Stacks-and-stack-overflow-checking.html http://www.freertos.org/uxTaskGetStackHighWaterMark.html


0
投票

我用过这个代码:

TaskHandle_t cipTask;
UBaseType_t uxHighWaterMark;
/* Print actual size of stack has used */
for (;;) {  
  uxHighWaterMark = uxTaskGetStackHighWaterMark(cipTask);
  Serial.println(uxHighWaterMark);
}
© www.soinside.com 2019 - 2024. All rights reserved.