FreeRTOS 調(diào)試方法
????很多時候,我們需要了解任務(wù)的執(zhí)行狀態(tài),任務(wù)棧的使用情況以及各個任務(wù)的 CPU 使用率,這時就需要用到官方提供的兩個函數(shù) vTaskList 和 vTaskGetRunTimeStats。用戶就可以通過這兩個函數(shù)獲得任務(wù)的執(zhí)行情況。
????STM32F103 實現(xiàn)串口打印調(diào)試
????為了獲取 FreeRTOS 的任務(wù)信息,需要創(chuàng)建一個定時器,這個定時器的時間基準(zhǔn)精度要高于系統(tǒng)時鐘節(jié)拍,這樣得到的任務(wù)信息才準(zhǔn)確。這里提供的函數(shù)僅用于測試目的,切不可將其用于實際項目,原因有兩點:
◆ FreeRTOS 的系統(tǒng)內(nèi)核沒有對總的計數(shù)時間做溢出保護。?
◆ 定時器中斷是 50us 進入一次,比較影響系統(tǒng)性能。 這里使用的是 32 位變量來保存 50us 一次的計數(shù)值,最大支持計數(shù)時間:2^32 * 50us / 3600s = 59.6 分鐘。運行時間超過了 59.6 分鐘將不準(zhǔn)確。 具體在 FreeRTOS 的工程中如何做才可以實現(xiàn)任務(wù)信息獲取呢?
????下面分三步進行說明。
1 使能相關(guān)宏定義 需要在 FreeRTOSConfig.h 文件中使能如下宏定義:
其中變量 ulHighFrequencyTimerTicks 是需要用戶去定義的,這里是將其定義在了定時器初始化文件 SysInfoTest.c 里面。
2 精度高于滴答定時器的時鐘初始化
????這里采用 STM32F103 內(nèi)部的TIM6 實現(xiàn) 50us 一次的中斷,在中斷函數(shù)里面對變量 ulHighFrequencyTimerTicks 進行計數(shù)操作,以供 FreeRTOS 系統(tǒng)使用,具體的代碼如下:
其中函數(shù) bsp_SetTIMforInt 在文件 bsp_tim_pwm.c 里面進行了實現(xiàn),源代碼如下:
????了解函數(shù)功能,不必細(xì)看
3 獲取任務(wù)執(zhí)行情況
????通過前面的設(shè)置后,就可以在工程中通過FreeRTOS的兩個函數(shù)vTaskList和 vTaskGetRunTimeStats 獲取任務(wù)的執(zhí)行情況。這里我們分成簡單的兩步進行說明:
????◆ 第 1 步:先做精度高于滴答定時器的時鐘初始化
◆ 第 2 步:初始化好以后就可以在 FreeRTOS 的任務(wù)中使用了。這里將任務(wù)信息獲取功能放在了任務(wù) vTaskTaskUserIF 里面去實現(xiàn):
????

上面截圖中打印出來的任務(wù)狀態(tài)字母 B, R, D, S 對應(yīng)如下含義:?
#define tskBLOCKED_CHAR ( 'B' ) 任務(wù)阻塞
#define tskREADY_CHAR ( 'R' ) 任務(wù)就緒?
#define tskDELETED_CHAR ( 'D' ) 任務(wù)刪除?
#define tskSUSPENDED_CHAR ( 'S' ) 任務(wù)掛起?
另外要注意剩余棧的單位是 word,即 4 字節(jié)。比如 vTaskUserIF 任務(wù)的剩余棧是 321,代表 321*4 = 1284 字節(jié)