FreeRTOS英文原文
How big should the stack be?https://www.freertos.org/FAQMem.html#StackSize
可以使用xTaskCreate()或xTaskCreateStatic() API函数创建任务。
函数的参数usStackDepth指定了将分配给正在创建的任务的堆栈的大小(用words,而不是bytes)
人们通常会问如何确定usStackDepth值,但是,除了下面描述的一种方式外,在使用RTOS时确定需要多少堆栈与编写裸机应用程序(不使用操作系统的应用程序)之间几乎没有区别。
与编写裸机应用程序一样,所需的堆栈数量取决于以下应用程序特定的参数:
- 函数调用嵌套深度
- 函数作用域变量声明的数量和大小
- 函数参数的数量
- 处理器体系结构
- 编译器
- 编译器优化级别
- 中断服务例程的堆栈要求 - 对于许多RTOS端口,该要求为零,因为RTOS将在进入中断服务例程时切换到使用专用中断堆栈。
每次计划程序为了运行不同的任务而暂时停止运行任务时,处理器上下文都会保存到任务的堆栈中。然后,保存的处理器上下文将在下次运行任务时从任务堆栈中弹出。保存处理器上下文所需的堆栈空间是来自 RTOS 本身的任务堆栈要求的唯一补充。
虽然确定要分配任务的堆栈量并不容易,但RTOS确实提供了允许采用务实的试错方法调整任务堆栈大小的功能。uxTaskGetStackHighWaterMark() API 函数可用于查看实际使用了多少堆栈,如果分配的堆栈超过必要的数量,则可以减小堆栈大小,并且堆栈溢出检测功能可用于确定堆栈是否太小。此外,所有RTOS任务的堆栈使用情况都可以使用uxTaskGetSystemState()API函数或众多的FreeRTOS感知IDE插件之一。
FreeRTOS 下载包含每个端口的演示应用程序,每个演示应用程序附带的 FreeRTOSConfig.h 文件定义了一个名为 configMINIMAL_STACK_SIZE 的常量。强烈建议永远不要为任务分配小于端口演示应用程序中使用的configMINIMAL_STACK_SIZE设置的堆栈。