liteos 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佔用率)採用任務級記錄的方式,在任務切換中,記錄任務啓動時間,和任務切出或者退出時間,每次任務退出,系統會累加整個任務的佔用時間。code

在los_config.h中能夠對CPU佔用率模塊進行選配,對於CPU佔用模塊,可經過LOSCFG_KERNEL_CPUP配置打開(YES)和關閉(NO)。接口

Huawei LiteOS提供如下兩種CPU佔用率的信息查詢:開發

  • 系統CPU佔用率。
  • 任務CPU佔用率。

CPU佔用率的計算方法:產品

系統CPU佔用率=系統中除idle任務外其餘任務運行總時間/系統運行總時間it

任務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佔用率的典型開發流程:

  1. 調用獲取系統CPU使用率函數LOS_SysCpuUsage。
  2. 調用獲取系統歷史CPU使用率函數LOS_HistorySysCpuUsage。
  • 系統根據不一樣模式進入任務獲取不一樣時間段的系統計數值,恢復中斷;
  1. 調用獲取指定任務CPU使用率函數LOS_TaskCpuUsage。
  • 若任務已建立而且可用,則關中斷,正常獲取,恢復中斷;
  • 若任務未建立或不可用,則返回錯誤碼;
  1. 調用獲取指定任務歷史CPU使用率函數LOS_HistoryTaskCpuUsage。
  • 若任務已建立而且可用,則關中斷,根據不一樣模式正常獲取,恢復中斷;
  • 若任務未建立或不可用,則返回錯誤碼;
  1. 調用獲取全部任務CPU使用率函數LOS_AllTaskCpuUsage。
  • 若CPUP已初始化,則關中斷,根據不一樣模式正常獲取,恢復中斷;
  • 若CPUP未初始化或有非法入參,則返回錯誤碼;

3 注意事項

  • 因爲CPU佔用率對性能有必定的影響,同時只有在產品開發時須要瞭解各個任務的佔用率,所以建議在產品發佈時,關掉CPUP模塊的裁剪開關LOSCFG_KERNEL_CPUP。

  • 經過上述接口獲取到的返回值是千分值。該值能夠經過與LOS_CPUP_PRECISION_MULT相除得到相應的百分值。

4 編程實例

4.1 實例描述

本實例實現以下功能:

  1. 建立一個用於CPUP測試的任務。
  2. 獲取當前系統CPUP。
  3. 以不一樣模式獲取歷史系統CPUP。
  4. 獲取建立的CPUP測試任務的CPUP。
  5. 以不一樣模式獲取建立的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 ---

相關文章
相關標籤/搜索