前言
本筆記基於 stm32+FreeRTOS。
主要參考野火、安富萊。
概念
簡單概要:
-
各任務cpu利用率:
打印出各任務在某段時間內站用cpu時長的比例。 -
原理很簡單:
- 開啟一個高精度的定時器
- 讓一個全局變量(如:ulCpuTraceTick)不斷往上累加
- 每次切換任務時,記錄上一個任務占用了多少個高精度定時器的tick
- 累加到該表示該任務的變量中(如:ulCpuTraceTaskATick)
- ulCpuTraceTaskATick/ulCpuTraceTick 即可計算出該任務的CPU占用率。
作用
闊以清晰地看出各個任務的cpu利用率,驗證一個系統好壞的方法之一。
如,一個系統總任務cpu利用率經常 大於80%,會造成一些緊急事件無法及時得到響應,同時,峰值可能超出100%,導致任務滯后。
又如,一個系統總任務cpu利用率經常 小於 10%,導致資源浪費。
再如,闊以監測各個任務 cup 占用率,發現某些任務經常 大於70%,便去優化優化該任務。
注:以上數值標准均為個人習慣,並非標准答案!
必看點
-
影響
該功能在調試時啟用,在產品發布時務必關閉。
因為監測cpu利用率也是消耗cpu資源的。 -
時鍾精度
一般為系統時鍾節拍的 10-20 倍。
如,當前系統節拍為 1000 Hz,那么定時器節拍則為 10000-20000 Hz。按20000 Hz 計算,即 50us 計算一次。由於FreeRTOS沒有對其進行溢出保護,所以最大支持計數時間為:2^32 * 50us / 3600s = 59.6 分鍾。超出后結果將不准確。
實現
添加幾個宏定義
源碼
FreeRTOS
/*
* 當前文件為 FreeRTOSConfig.h
*/
#define configUSE_TRACE_FACILITY 1 /* cpu task */
/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS 1 /* cpu task */
#define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* cpu task */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulCpuTraceTick = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE() ulCpuTraceTick
STM32 定時器
(待寫)
簡要說明
-
configUSE_TRACE_FACILITY:
- 啟用FreeRTOS可視化追蹤調試功能
-
configGENERATE_RUN_TIME_STATS:
- 啟用FreeRTOS運行時間統計功能
-
configUSE_STATS_FORMATTING_FUNCTIONS:
- 啟用FreeRTOS格式化函數功能
-
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS:
- 重置自定義心跳值
-
portGET_RUN_TIME_COUNTER_VALUE:
- 宏定義自定義心跳變量
-
ulCpuTraceTick
- 自定義心跳值,高頻累加即可。