天天看點

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

1、cpuusage是什麼

cpuusage(即CPU使用率,本文均用cpuusage指代CPU使用率)通常是指:CPU從事任何工作的時間比例。 如:90%的cpuusage表示CPU處于90%忙碌狀态和10%空閑狀态。當CPU空閑時,它什麼也不做,在嵌入式實時作業系統RTOS上,它會進入idle狀态,idle本身也是一個task,它隻是在等待中斷,消耗CPU。

在RTOS上,CPU 都是分時間片使用的。比如:任務A運作了10ms,然後切換到任務B,B運作了30ms,然後空閑60ms(即進入idle task運作60ms),接着切換回任務A周期這樣運作。如果在一段時間内都是如此,那麼這段時間内的cpuusage為40%(其中任務A的cpuusage為10%,任務B的cpuusage為30%)。

cpuusage可以反映目前cpu的繁忙程度,cpuusage 越高,說明在裝置上運作了很多程式,反之較少。如果cpuusage在一段時間内一直過高,可能是高優先級的任務一直占據着CPU來運作,導緻了低優先級的任務始終無法獲得CPU來運作,這樣的設計可能存在問題。是以,cpuusage的統計可以幫助我們優化應用程式。

## 2、AliOS Things上cpuusage如何被統計出來

### 2.1、cpuusage統計原理

任務cpuusage: 任務在統計周期内的執行時間除以統計周期即為任務的cpuusage。

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

總cpuusage:除idle任務外,所有任務在統計周期内的累計執行時間/統計周期,這時可以通過100%-idle任務cpuusage來計算。

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

舉例說明:

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

以上述執行時序為例,在統計周期内,task1被排程執行1次,task2被排程執行2次,其餘時間均為idle任務運作。

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用
HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

2.2、任務運作時間的累計

單個任務的單次統計時間确定好後,那麼在一段時間内,任意任務的運作時間就可以确定下來——隻需将這段時間内這個任務的運作時間進行累計。

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

以上圖中的任務切換為例:

假設 Task1的在 t1 時刻已經運作的時間為 total_task1,Task2的在 t1 時刻已經運作的時間為 total_task2;

那麼在 t2 時刻,total_task1更新為

``total_task1 += t2 - t1;

``

在 t3 時刻,total_task2更新為

``total_task2 += t3 - t2;

如此累計下去,就可以獲得一段時間内,需要統計任務的運作時間總和。

3、HaaS100上cpuusage如何使用

3.1、打開平台配置

在相應平台的 k_config.h 檔案中配置如下宏:

  • RHINO_CONFIG_SYS_STATS配置為1,啟用統計功能;
  • RHINO_CONFIG_HW_COUNT配置為1,使用硬體計時器(該計時器需要适配)。
#ifndef RHINO_CONFIG_SYS_STATS
#define RHINO_CONFIG_SYS_STATS               1
#endif

#ifndef RHINO_CONFIG_HW_COUNT
#define RHINO_CONFIG_HW_COUNT                1
#endif           

3.2、适配硬體定時器

cpuusage的時間統計,是通過闆卡上自帶的高精度的硬體定時器來實作的,這個硬體定時器的主頻一般是幾MHz~幾十MHz不等。

這個定時器值的擷取依賴硬體廠商提供的bsp接口,為了屏蔽這些底層硬體的差異,AliOS Things提供了一個統一的接口來擷取這個定時器的值,如下:

``hr_timer_t soc_hr_hw_cnt_get(void);

``

在HaaS100開發闆上,如果有開發者對定時基準細節感興趣,可以參考定時器的擷取接口的實作細節,代碼位于:

``platform/board/haas100/config/board.c

AliOS Things 代碼下載下傳及說明

注意: 我們在HaaS100上已經打開了平台配置開關,同時适配好了硬體定時器。

也就是說,在HaaS100上cpuusage的功能是預設打開的,可以直接使用!

3.3、使用方法——通過cli指令cpuusage

puusage是kernel 自帶的一個指令,不依賴任何app,也就是說,隻要在編譯時加上cli 元件,在cli shell下執行一個指令cpuusage,即可開始統計系統内所有任務的cpuusage。

注意:關于cli 元件如何打開使用,請參考另外一篇文章——見文尾連結“傳送門”《一文輕松入門HaaS100診斷調試系統》。

3.3.1、指令使用說明

cpuusage [-d n] [-t m] 指令啟動CPU使用率統計
其中:-d選項用于指定統計周期,機關為ms,預設為1 s;
      -t選項用于指定統計時長,機關為ms,預設為連續運作。
      
舉例說明:
cpuusage                   -- 啟動一個cpuusage任務,該任務預設每隔1s執行一次統計;
cpuusage -d 3000           -- 啟動一個cpuusage任務,該任務預設每隔3s(3000ms)執行一次統計;
cpuusage -d 2000 -t 10000  -- 啟動一個cpuusage任務,該任務預設每隔2s(2000ms)執行一次統計,
                              統計到10s(10000ms)後停止;
                              
ctrl+c 結束統計                           

3.3.2、指令運作截圖

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

可以看到執行了cpuusage 指令後,每秒列印出一次目前系統内所有task的CPU使用率,目前系統内沒有跑應用,idle_task的運作時間占據了99.99%。

希望開發者也可以動手嘗試,建立幾個任務,觀察下cpuusage有什麼變化。

4、開發者技術支援

如需更多技術支援,可加入釘釘開發者群

HaaS100開發調試系列 之 CPU使用率(cpuusage)的原理與使用

更多技術與解決方案介紹,請通路阿裡雲AIoT首頁

https://iot.aliyun.com/

繼續閱讀