1 前言
出於性能方面的考慮,有的時候,我們希望知道CPU的使用率為多少,進而判斷此CPU的負載情況和對於當前運行環境是否足夠“勝任”。本文將介紹一種計算CPU占有率的方法以及其實現原理。
2 移植算法
2.1 算法簡介
此算法是基於操作系統的,理論上不限於任何操作系統,只要有任務調度就可以。本文將以FreeRTOST為例來介紹本算法的使用方法。
本文所介紹的算法出處為隨Cube庫一起提供的,它在cube庫中的位置如下圖所示:
本文將以STM32F4為例,測試環境為STM3240G-EVAL評估板。
2.2 開始移植
本文以CubeF4內的示例代碼工程STM32Cube_FW_F4_V1.10.0ProjectsSTM324xG_EVALApplicationsFreeRTOSFreeRTOS_ThreadCreation為例,IDE使用IAR。
第一步:使用IAR打開FreeRTOS_ThreadCreation工程,將cpu_utils.c文件添加到工程,並在工程中添加對應頭文件目錄:
第二步:打開FreeRTOST的配置頭文件FreeRTOSConfig.h修改宏configUSE_IDLE_HOOK和configUSE_TICK_HOOK的值為1: #define configUSE_PREEMPTION 1
第三步:繼續在FreeRTOSConfig.h頭文件的末尾處添加traceTASK_SWITCHED_IN與traceTASK_SWITCHED_OUT定義:
第四步:在main.h頭文件中include “”cmsis_os.h“”
Main.h :
第五步: 修改工程屬性,使編譯過程不需要函數原型:
第六步:在工程中任何用戶代碼處都可以調用osGetCPUUsage()函數來獲取當前CPU的使用率:
第七步:編譯並運行測試
在調試狀態下使用Live Watch窗口監控全部變量osCPU_Usage的值:
osCPU_Usage是在cpu_utils.c文件中定義的全局變量,表示當前CPU的使用率,是個動態值,由上圖可以,CPU使用率的動態值為20%。實際在代碼中是按第六步中調用osGetCPUUsage()函數來獲取當前CPU的使用率的。
至此,算法使用方法介紹完畢。
3 算法實現原理分析
操作系統運行時是不斷在不同的任務間進行切換,而驅動這一調度過程是通過系統tick來驅動的,即每產生一次系統tick則檢查一下當前正在運行的任務的環境判斷是否需要切換任務,即調度,如果需要,則觸發PendSV,通過在PendSV中斷調用vTaskSwitchContext()函數來實現任務的調度。而本文所要講述的CPU使用率算法是通過在一定時間內(1000個時間片內),計算空閑任務所占用的時間片總量,100減去空閑任務所占百分比則為工作任務所占百分比,即CPU使用率。
此函數為空閑任務鈎子函數,每次當切換到空閑任務時就會運行此鈎子函數,它的作用就是記錄當前空閑任務的句柄並保存到全局變量xIdleHandle。
此函數為操作系統的tick鈎子函數,即每次產生系統tick中斷都會進入到此鈎子函數。此鈎子函數實際上就是具體計算CPU使用率的算法了。osCPU_TotalIdleTime是一個全局變量,表示在1000個tick時間內空閑任務總共占用的時間片,CALCULATION_PERIOD宏的值為1000,即每1000個tick時間內重新計算一次CPU的使用率。
下面兩個函數就是如何計算osCPU_TotalIdleTime的:
這兩個函數是調度器鈎子函數,在調度器進行任務切進和切出時分別回調,StartIdleMonitor()函數記錄切換到空閑任務時的時間點,EndIdleMonitor()則在推出空閑任務時計算此次空閑任務花費多長時間,並累加到osCPU_TotalIdleTime,即空閑任務總共占用的時間片。
全局變量osCPU_Usage保存的就是CPU的使用率,它是在操作系統的tick鈎子函數中每隔1000個tick就被重新計算一次。
4 結論
通過此方法可以很好的用來評估STM23 MCU的運行性能。
【來源】