天天看點

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

在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占用率的典型開發流程:

  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 ---```