在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);
}
}