最近我正在使用 FreeRTOS 并创建了一些任务来执行我所需的操作。虽然似乎每次我使用
xTaskCreate()
或 TI GUI 配置创建新任务时,我只是尝试将堆栈大小保持为所需的大小,以免堆栈溢出。
有什么方法可以计算我的任务对于以下事件使用的最大堆栈大小吗?
编译器、编译器优化级别、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
我用过这个代码:
TaskHandle_t cipTask;
UBaseType_t uxHighWaterMark;
/* Print actual size of stack has used */
for (;;) {
uxHighWaterMark = uxTaskGetStackHighWaterMark(cipTask);
Serial.println(uxHighWaterMark);
}