HaaS100 開發除錯系列 之 CPU利用率(cpuusage)的原理與使用

語言: CN / TW / HK

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。

 

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

 

舉例說明:

image.png

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

 

 

 

2.2、任務執行時間的累計

單個任務的單次統計時間確定好後,那麼在一段時間內,任意任務的執行時間就可以確定下來——只需將這段時間內這個任務的執行時間進行累計。

image.png

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

假設 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 檔案中配置如下巨集:

  1. RHINO_CONFIG_SYS_STATS配置為1,啟用統計功能;
  2. 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

cpuusage是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、命令執行截圖

image.png

可以看到執行了cpuusage 命令後,每秒打印出一次當前系統內所有task的CPU利用率,當前系統內沒有跑應用,idle_task的執行時間佔據了99.99%。

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

 

4、傳送門

一文輕鬆入門HaaS100診斷除錯系統

 

5、開發者技術支援

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

更多技術與解決方案介紹,請訪問阿里雲AIoT首頁https://iot.aliyun.com/