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占用率,判斷目前系統負載是否超出設計規格。
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 ---```