1. 概述 1.1 基本概念 CPU(中央處理器, Central Processing Unit)占用率可以分為系統CPU占用率和任務CPU占用率兩種。 系統CPU占用率(CPU Percent)是指周期時間內系統的CPU占用率,用於表示系統一段時間內的閑忙程度,也表示CPU的負載情況。系統CPU ...
1. 概述
1.1 基本概念
CPU(中央處理器, Central Processing Unit)占用率可以分為系統CPU占用率和任務CPU占用率兩種。
系統CPU占用率(CPU Percent)是指周期時間內系統的CPU占用率,用於表示系統一段時間內的閑忙程度,也表示CPU的負載情況。系統CPU占用率的有效表示範圍為0~100,其精度(可通過配置調整)為百分比。 100表示系統滿負荷運轉。
任務CPU占用率指單個任務的CPU占用率,用於表示單個任務在一段時間內的閑忙程度。任務CPU占用率的有效表示範圍為0~100,其精度(可通過配置調整)為百分比。 100表示在一段時間內系統一直在運行該任務。
用戶通過系統級的CPU占用率,判斷當前系統負載是否超出設計規格。
通過系統中各個任務的占用情況,判斷查看當前的各個任務的CPU占用率是否符合設計的預期。
1.2 運作機制
Huawei LiteOS的CPUP(CPU Percent,系統CPU占用率)採用任務級記錄的方式,在任務切換中,記錄任務啟動時間,和任務切出或者退出時間,每次任務退出,系統會累加整個任務的占用時間。
在los_config.h中可以對CPU占用率模塊進行選配,對於CPU占用模塊,可通過LOSCFG_KERNEL_CPUP配置打開(YES)和關閉(NO)。
Huawei LiteOS提供以下兩種CPU占用率的信息查詢:
- 系統CPU占用率。
- 任務CPU占用率。
CPU占用率的計算方法:
系統CPU占用率=系統中除idle任務外其他任務運行總時間/系統運行總時間
任務CPU占用率=任務運行總時間/系統運行總時間
2 開髮指導
2.1 使用場景
通過系統級的CPU占用率,判斷當前系統負載是否超出設計規格。
通過系統中各個任務的占用情況,判斷查看當前的各個任務的CPU占用率是否符合設計的預期。
2.2 功能
Huawei LiteOS系統中的CPU占用率模塊為用戶提供下麵幾種功能。
功能分類 | 介面名 | 描述 |
---|---|---|
獲取系統CPU占用率 | LOS_SysCpuUsage | 獲取當前系統CPU占用率 |
--- | LOS_HistorySysCpuUsage | 獲取系統歷史CPU占用率 |
獲取任務CPU占用率 | LOS_TaskCpuUsage | 獲取指定任務CPU占用率 |
- | LOS_HistoryTaskCpuUsage | 獲取指定任務歷史CPU占用率 |
- | LOS_AllTaskCpuUsage | 獲取所有任務CPU占用率 |
2.3 開發流程
CPU占用率的典型開發流程:
- 調用獲取系統CPU使用率函數LOS_SysCpuUsage。
- 調用獲取系統歷史CPU使用率函數LOS_HistorySysCpuUsage。
- 系統根據不同模式進入任務獲取不同時間段的系統計數值,恢復中斷;
- 調用獲取指定任務CPU使用率函數LOS_TaskCpuUsage。
- 若任務已創建並且可用,則關中斷,正常獲取,恢復中斷;
- 若任務未創建或不可用,則返回錯誤碼;
- 調用獲取指定任務歷史CPU使用率函數LOS_HistoryTaskCpuUsage。
- 若任務已創建並且可用,則關中斷,根據不同模式正常獲取,恢復中斷;
- 若任務未創建或不可用,則返回錯誤碼;
- 調用獲取所有任務CPU使用率函數LOS_AllTaskCpuUsage。
- 若CPUP已初始化,則關中斷,根據不同模式正常獲取,恢復中斷;
- 若CPUP未初始化或有非法入參,則返回錯誤碼;
3 註意事項
由於CPU占用率對性能有一定的影響,同時只有在產品開發時需要瞭解各個任務的占用率,因此建議在產品發佈時,關掉CPUP模塊的裁剪開關LOSCFG_KERNEL_CPUP。
通過上述介面獲取到的返回值是千分值。該值可以通過與LOS_CPUP_PRECISION_MULT相除獲得相應的百分值。
4 編程實例
4.1 實例描述
本實例實現如下功能:
- 創建一個用於CPUP測試的任務。
- 獲取當前系統CPUP。
- 以不同模式獲取歷史系統CPUP。
- 獲取創建的CPUP測試任務的CPUP。
- 以不同模式獲取創建的CPUP測試任務的CPUP。
4.2 編程示例
前提條件:
- 在los_config.h中,將OS_INCLUDE_CPUP配置項打開。
代碼實現如下:
#include "los_task.h"
#include "los_cpup.h"
#define MODE 4
UINT32 cpupUse;
OS_CPUP_TASK_S pstCpup;
UINT16 pusMaxNum = 0;
UINT32 g_CpuTestTaskID;
VOID Example_cpup()
{
printf("entry cpup test example\n");
while(1) {
usleep(100);
}
}
UINT32 it_cpup_test()
{
UINT32 uwRet;
TSK_INIT_PARAM_S CpupTestTask;
/*創建用於cpup測試的任務*/
memset(&CpupTestTask, 0, sizeof(TSK_INIT_PARAM_S));
CpupTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_cpup;
CpupTestTask.pcName = "TestCpupTsk"; /*測試任務名稱*/
CpupTestTask.uwStackSize = OS_TSK_DEFAULT_STACK_SIZE;
CpupTestTask.usTaskPrio = 5;
CpupTestTask.uwResved = LOS_TASK_STATUS_DETACHED;
uwRet = LOS_TaskCreate(&g_CpuTestTaskID, &CpupTestTask);
if(uwRet != LOS_OK)
{
printf("CpupTestTask create failed .\n");
return LOS_NOK;
}
usleep(100);
/*獲取當前系統cpu占用率*/
cpupUse = LOS_SysCpuUsage();
printf("the current system cpu usage is: %d\n",cpupUse);
/*獲取歷史系統cpu 1s內的占用率,歷史cpu占用率的獲取分三種模式,MODE1表示10s 內占用率,MODE2表示
前一個1s內占用率,MODE3表示小於1s內*/
//cpupUse = LOS_HistorySysCpuUsage(MODE1);
//printf("the history system cpu usage in 10s: %d\n",cpupUse);
//cpupUse = LOS_HistorySysCpuUsage(MODE2);
//printf("the history system cpu usage in 1s: %d\n",cpupUse);
cpupUse = LOS_HistorySysCpuUsage(MODE);
printf("the history system cpu usage in <1s: %d\n",cpupUse);
/*獲取指定任務的cpu占用率,該測試常式中指定的任務為以上創建的cpup測試任務*/
cpupUse = LOS_TaskCpuUsage(g_CpuTestTaskID);
printf("cpu usage of the CpupTestTask:\n TaskID: %d\n usage: %d\n",g_CpuTestTaskID,cpupUse);
/*獲取指定歷史任務在<1s內的cpu占用率,該測試常式中指定的任務為以上創建的cpup測試任務*/
cpupUse = LOS_HistoryTaskCpuUsage(g_CpuTestTaskID, MODE);
printf("cpu usage of the CpupTestTask in <1s:\n TaskID: %d\n usage:%d
\n",g_CpuTestTaskID,cpupUse);
return LOS_OK;
}
4.3 結果驗證
編譯運行得到的結果為:
--- Test start--- ntry cpup test example uawei LiteOS# the current system cpu usage is : 49 he history system cpu usage in <1s: 50 pu usage of the CpupTestTask: askID:4 sage:17 pu usage of the CpupTestTask in <1s: askID:4 sage:12 ---Test End ---