【轉】STM32: 一種計算CPU使用率的方法及其實現原理


 

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的運行性能。

 

來源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM