FreeRTOS 除錯--列印任務執行情況
FreeRTOS 除錯–列印任務執行情況
官方API函式中有兩個函式可以提供任務的一些情況,一個是:
void vTaskList( char * pcWriteBuffer )
第二個是:
void vTaskGetRunTimeStats( char *pcWriteBuffer )
;
下面就介紹下這兩個函式:
任務列表函式:
void vTaskList( char * pcWriteBuffer )
,該函式將任務的執行狀態,任務優先順序,剩餘棧,優先順序通過sprintf()函式列印到pcWriteBuffer中,接下來只需要將pcWriteBuffervoid vTaskList( char * pcWriteBuffer )
的例子。static void vLEDTask( void *pvParameters ) { uint8_t pcWriteBuffer[500]; while(1) { LED_Toggle(GREEN_LED_Toggle); printf("LED Toggle\n"); vTaskList((char *)&pcWriteBuffer); printf("任務名 任務狀態 優先順序 剩餘棧 任務序號\r\n"
在工程中建立上述任務,編譯提示不通過,
使用sourceinsight跟蹤原始碼,發現xTaskList()前有條件編譯:
所以必須滿足條件編譯條件才能使用該函式,那麼就需要將FreeRTOSConfig.h中
改為:#define configUSE_TRACE_FACILITY 1
並且在 FreeRTOSConfig.h中新增:
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
這樣子配置完,編譯通過,列印效果如下圖:
其中要注意的是剩餘棧的大小單位是WORD,如IDLE的剩餘棧大小為:118*4=472位元組。任務執行狀態函式:
void vTaskGetRunTimeStats( char *pcWriteBuffer )
,該函式可以提供相應任務的計數以及相應的佔用率;要獲准任務準確的執行狀態,需要定義一個初始化一個定時器,用來提供相應的計時,FreeRTOS要求該定時器的頻率至少為滴答定時器的10倍,見下圖:
所以你可以初始化一個1ms的定時器,在FreeRTOSConfig.h提供一個外部變數,並做以下定義:
並且記得在該定時器的中斷中要對該外部變數進行自加,這樣子配置完,就可以使用該函數了,效果如下:static void vLEDTask( void *pvParameters ) { uint8_t pcWriteBuffer[500]; while(1) { LED_Toggle(GREEN_LED_Toggle); printf("LED Toggle\n"); vTaskList((char *)&pcWriteBuffer); printf("任務名 任務狀態 優先順序 剩餘棧 任務序號\r\n"); printf("%s\r\n", pcWriteBuffer); vTaskGetRunTimeStats((char *)&pcWriteBuffer); printf("\r\n任務名 執行計數 使用率\r\n"); printf("%s\r\n", pcWriteBuffer); } }
參考資料
【安富萊】FreeRTOS作業系統教程釋出,支援F103,F407和F429,配套145個例子,1200頁教程|FreeRTOS