FreeRTOS 源碼下載地址
1、官方文檔提供了 函數 用來查詢 任務 剩余 棧 空間,首先是看官方的文檔解釋(某位大神 翻譯 的 官方文檔。)
參數解釋: xTask:被查詢任務的句柄——欲知如何獲得任務句柄,詳情請參見API 函數xTaskCreate()的參數pxCreatedTask。如果傳入 NULL 句柄,則任務查詢的是自身棧空間的高水線。
返回值: 任務棧空間的實際使用量會隨着任務執行和中斷處理過程上下浮動。uxTaskGetStackHighWaterMark()返回從任務啟動執行開始的運行歷史中,棧空間具有的最小剩余量。這個值即是棧空間使用達到最深時的剩下的未使用的棧空間。這個值越是接近0,則這個任務就越是離棧溢出不遠了。
下面要說我的 使用方法:
首先 在 創建任務的時候 得 添加任務句柄:
具體方法是:
1、xTaskHandle pvCreatedTask_ToggleLed4; //這句代碼 是定義一個 空指針變量。(typedef void * xTaskHandle;)
2、xTaskCreate(ToggleLed4, (int8_t *)"LED4", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO,&pvCreatedTask_ToggleLed4);//創建一個任務
3、要使用uxTaskGetStackHighWaterMark 這個函數,首先得看下面說明:
* INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for
* this function to be available.
意思是在FreeRTOS.h(英文描述錯誤,實際在這個FreeRTOS.h中)文件中要 把 INCLUDE_uxTaskGetStackHighWaterMark的宏定義改為1,不能改的,修改一下文檔的屬性,把只讀去掉!
2018年8月8日14:06:45,注,不是源文檔描述錯誤,是我理解錯誤,應該修改配置文件 FreeRTOSConfig.h,在該文件中 增加 宏定義 #define INCLUDE_uxTaskGetStackHighWaterMark 1。
4、//下面就是我要查詢的 任務 剩余的棧空間,里面調用了uxTaskGetStackHighWaterMark 這個函數
void ToggleLed4(void * pvParameters)
{
unsigned portBASE_TYPE uxHighWaterMark;
for( ;; )
{
/* toggle LED4 each 250ms */
STM_EVAL_LEDToggle(LED4);
uxHighWaterMark=uxTaskGetStackHighWaterMark( pvCreatedTask_ToggleLed4 );
printf("ToggleLed4剩余棧空間是多少:%d.\r\n",uxHighWaterMark);//gxp,串口檢測,2015年11月17日11:26:42
vTaskDelay(500);
}
}
5、看 結果:
6、分析:
1、這里的 “74”,應該就是 74*4=296個 字節(1字節=8位),因為 freertos 在設置棧的時候是按照 “字”計算的,在STM32中一個字是32位!
2、根據 返回的數據判斷,這個任務 還剩余 296個字節沒有使用。
3、configMINIMAL_STACK_SIZE==128,還剩余74,就是已經使用等於128-74=54,那么設置任務棧的時候應該設置(已經使用*2)即54*2=108合適,即2倍合適(參考),2017年11月7日08:56:24.
7、2016年11月28日17:25:23,可以通過API 直接看系統的運行情況,進行可視化調試,這里推薦一個大神的博客!
朱工:http://blog.csdn.net/zhzht19861011/article/details/50717549
如果文章對你有幫助,微信贊賞碼: