CPU(中央處理器, Central Processing Unit)佔用率能夠分爲系統CPU佔用率和任務CPU佔用率兩種。編程
系統CPU佔用率(CPU Percent)是指週期時間內系統的CPU佔用率,用於表示系統一段時間內的閒忙程度,也表示CPU的負載狀況。系統CPU佔用率的有效表示範圍爲0~100,其精度(可經過配置調整)爲百分比。 100表示系統滿負荷運轉。函數
任務CPU佔用率指單個任務的CPU佔用率,用於表示單個任務在一段時間內的閒忙程度。任務CPU佔用率的有效表示範圍爲0~100,其精度(可經過配置調整)爲百分比。 100表示在一段時間內系統一直在運行該任務。性能
用戶經過系統級的CPU佔用率,判斷當前系統負載是否超出設計規格。測試
經過系統中各個任務的佔用狀況,判斷查看當前的各個任務的CPU佔用率是否符合設計的預期。設計
Huawei LiteOS的CPUP(CPU Percent,系統CPU佔用率)採用任務級記錄的方式,在任務切換中,記錄任務啓動時間,和任務切出或者退出時間,每次任務退出,系統會累加整個任務的佔用時間。code
在los_config.h中能夠對CPU佔用率模塊進行選配,對於CPU佔用模塊,可經過LOSCFG_KERNEL_CPUP配置打開(YES)和關閉(NO)。接口
Huawei LiteOS提供如下兩種CPU佔用率的信息查詢:開發
CPU佔用率的計算方法:產品
系統CPU佔用率=系統中除idle任務外其餘任務運行總時間/系統運行總時間it
任務CPU佔用率=任務運行總時間/系統運行總時間
經過系統級的CPU佔用率,判斷當前系統負載是否超出設計規格。
經過系統中各個任務的佔用狀況,判斷查看當前的各個任務的CPU佔用率是否符合設計的預期。
Huawei LiteOS系統中的CPU佔用率模塊爲用戶提供下面幾種功能。
功能分類 | 接口名 | 描述 |
---|---|---|
獲取系統CPU佔用率 | LOS_SysCpuUsage | 獲取當前系統CPU佔用率 |
--- | LOS_HistorySysCpuUsage | 獲取系統歷史CPU佔用率 |
獲取任務CPU佔用率 | LOS_TaskCpuUsage | 獲取指定任務CPU佔用率 |
- | LOS_HistoryTaskCpuUsage | 獲取指定任務歷史CPU佔用率 |
- | LOS_AllTaskCpuUsage | 獲取全部任務CPU佔用率 |
CPU佔用率的典型開發流程:
因爲CPU佔用率對性能有必定的影響,同時只有在產品開發時須要瞭解各個任務的佔用率,所以建議在產品發佈時,關掉CPUP模塊的裁剪開關LOSCFG_KERNEL_CPUP。
經過上述接口獲取到的返回值是千分值。該值能夠經過與LOS_CPUP_PRECISION_MULT相除得到相應的百分值。
本實例實現以下功能:
前提條件:
代碼實現以下:
#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; }
編譯運行獲得的結果爲:
--- 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 ---