在freertos里面创建任务时会遇到需要配置任务栈空间的大小也就是下面这个函数中的usStackDepth参数(需要注意的是这个参数的单位是字(word),而不是字节)
portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode,
const signed portCHAR* const pcName,
unsigned portSHORT usStackDepth,
void *pvParameters,
unsigned portBASE_TYPE uxPriority,
xTaskHandle *pxCreatedTask);
如果这里随意分配就有可能意味着浪费或者程序挂死在这里,而要知道这里到底应该怎么分配,网上的说法好像都是说的需要自己通过计算函数的形参,临时变量等的总大小再乘以1.5到2来分配,但是感觉这样也太麻烦了(其实是自己对函数形参,函数到底需要多少个字节记得不清楚了),所以又找了下能不能查到任务到底需要多少空间,就有了这篇博客。
官方文档提供了下面这个函数来查询任务栈的剩余空间
UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask)
其中xTask即为上面创建任务时获取到的任务句柄,返回值即为任务栈空间剩余的大小(这里的单位也是字)。
在使用上面这个函数之前需要在FreeRTOSConfig.h中将INCLUDE_uxTaskGetStackHighWaterMark配置为1,如果没有则增加此定义,下面放出一段示例代码:
void ToggleLed4(void * pvParameters)
{
unsigned portBASE_TYPE uxHighWaterMark;
while(1)
{
uxHighWaterMark=uxTaskGetStackHighWaterMark( pvCreatedTask_ToggleLed4 );
printf("size = %d\r\n",uxHighWaterMark);
vTaskDelay(500);
}
}