在 FreeRtos 或 TI rtos 中计算堆栈大小
Calculation of stack size in FreeRtos or TI rtos
最近我在使用 Rtos 并创建了一些任务来执行我需要的操作。尽管似乎每次我使用 xTaskCreate 或 TI GUI 配置创建新任务时,我只是尽量保持堆栈大小,以免堆栈溢出。
有什么方法可以计算我的任务针对这些事件使用的最大堆栈大小吗?
1.全局变量和局部变量使用的栈
2.函数递归使用的最大栈数
3.包括中断上下文切换
编译器、编译器优化级别、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);
}
最近我在使用 Rtos 并创建了一些任务来执行我需要的操作。尽管似乎每次我使用 xTaskCreate 或 TI GUI 配置创建新任务时,我只是尽量保持堆栈大小,以免堆栈溢出。 有什么方法可以计算我的任务针对这些事件使用的最大堆栈大小吗? 1.全局变量和局部变量使用的栈 2.函数递归使用的最大栈数 3.包括中断上下文切换
编译器、编译器优化级别、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);
}