1# CPU占用率 2 3 4## 基本概念 5 6CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率和任务CPU占用率。 7 8**系统CPU占用率**:是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~100,其单位为百分比。100表示系统满负荷运转。 9 10**任务CPU占用率**:指单个任务的CPU占用率,用于表示单个任务在一段时间内的闲忙程度。任务CPU占用率的有效表示范围为0~100,其单位为百分比。100表示在一段时间内系统一直在运行该任务。 11 12用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规格。 13 14通过系统中各个任务的CPU占用情况,判断各个任务的CPU占用率是否符合设计的预期。 15 16此外开启CPUP的情况下,可选择开启中断占用率统计。 17 18**中断占用率**:是指单个中断在全部中断消耗时间的占用率。占用率的有效表示范围为0~100。100表示在一段时间内仅触发该中断。 19 20 21## 运行机制 22 23OpenHarmony LiteOS-M的CPUP(CPU Percent,系统CPU占用率)采用任务级记录的方式,在任务切换时,记录任务启动时间,任务切出或者退出时间,每次当任务退出时,系统会累加整个任务的占用时间。 24 25可以在target_config.h的中对该功能进行选配。 26 27OpenHarmony LiteOS-M提供以下两种CPU占用率的信息查询: 28 29- 系统CPU占用率。 30- 任务CPU占用率。 31 32此外,系统还提供了中断占用率的信息查询能力(需同时开启CPUP和定时器)。 33 34**占用率的计算方法:** 35 36系统CPU占用率=系统中除idle任务外其他任务运行总时间/系统运行总时间 37 38任务CPU占用率=任务运行总时间/系统运行总时间 39 40中断占用率=单个中断运行时间/中断运行总时间 41 42 43## 接口说明 44 45 **表1** 功能列表 46 47| 功能分类 | 接口描述 | 48| -------- | -------- | 49| 获取系统CPU占用率 | LOS_SysCpuUsage:获取当前系统CPU占用率<br/> LOS_HistorySysCpuUsage:获取系统历史CPU占用率 | 50| 获取任务CPU占用率 | LOS_TaskCpuUsage:获取指定任务CPU占用率<br/> LOS_HistoryTaskCpuUsage:获取指定任务历史CPU占用率<br/> LOS_AllTaskCpuUsage:获取所有任务CPU占用率 | 51| 输出任务CPU占用率 | LOS_CpupUsageMonitor:输出任务历史CPU占用率 | 52| 获取中断CPU占用率 | LOS_GetAllIrqCpuUsage:获取所有中断CPU占用率 | 53 54## 开发流程 55 56在kernel/liteos_m目录下执行 make menuconfig 命令配置"Kernel->Enable Cpup"中打开YES开启任务cpup; 57 58开启后出现新选项“Enable Cpup include irq”打开YES开启中断cpup。 59 60CPU占用率的典型开发流程: 61 621. 调用获取系统CPU占用率函数LOS_SysCpuUsage。 63 642. 调用获取系统历史CPU占用率函数LOS_HistorySysCpuUsage。 65 663. 调用获取指定任务CPU占用率函数LOS_TaskCpuUsage。 67 - 若任务已创建,则关中断,正常获取,恢复中断; 68 - 若任务未创建,则返回错误码; 69 704. 调用获取指定任务历史CPU占用率函数LOS_HistoryTaskCpuUsage。 71 - 若任务已创建,则关中断,根据不同模式正常获取,恢复中断; 72 - 若任务未创建,则返回错误码; 73 745. 调用获取所有任务CPU占用率函数LOS_AllCpuUsage。 75 - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; 76 - 若CPUP未初始化或有非法入参,则返回错误码; 77 78 79## 编程实例 80 81 82### 实例描述 83 84本实例实现如下功能: 85 861. 创建一个用于CPUP测试的任务。 87 882. 获取当前系统CPUP。 89 903. 以不同模式获取历史系统CPUP。 91 924. 获取创建的测试任务的CPUP。 93 945. 以不同模式获取创建的测试任务的CPUP 95 96 97### 示例代码 98 99前提条件: 100 101在kernel/liteos_m目录下执行 make menuconfig命令配置"Kernel->Enable Cpup"中开启任务cpup: 102 103代码实现如下: 104 105本演示代码在 ./kernel/liteos_m/testsuites/src/osTest.c 中编译验证,在TestTaskEntry中调用验证入口函数ExampleCpup。 106 107 108``` 109#include "los_task.h" 110#include "los_cpup.h" 111 112#define TEST_TASK_PRIO 5 113#define TASK_DELAY_TIME 100 114VOID CpupTask(VOID) 115{ 116 printf("entry cpup test example\n"); 117 usleep(TASK_DELAY_TIME); 118 usleep(TASK_DELAY_TIME); 119 printf("exit cpup test example\n"); 120} 121 122UINT32 ExampleCpup(VOID) 123{ 124 UINT32 ret; 125 UINT32 cpupUse; 126 UINT32 taskID; 127 TSK_INIT_PARAM_S cpupTestTask = { 0 }; 128 129 cpupTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)CpupTask; 130 cpupTestTask.pcName = "TestCpupTsk"; 131 cpupTestTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; 132 cpupTestTask.usTaskPrio = TEST_TASK_PRIO; 133 ret = LOS_TaskCreate(&taskID, &cpupTestTask); 134 if(ret != LOS_OK) { 135 printf("cpupTestTask create failed .\n"); 136 return LOS_NOK; 137 } 138 139 usleep(TASK_DELAY_TIME); 140 141 /* 获取当前系统CPU占用率 */ 142 cpupUse = LOS_SysCpuUsage(); 143 printf("the current system cpu usage is: %u.%u\n", 144 cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 145 146 /* 获取当前系统历史CPU占用率 */ 147 cpupUse = LOS_HistorySysCpuUsage(CPUP_LESS_THAN_1S); 148 printf("the history system cpu usage in all time:%u.%u\n", 149 cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 150 151 /* 获取指定任务的CPU占用率 */ 152 cpupUse = LOS_TaskCpuUsage(taskID); 153 printf("cpu usage of the cpupTestTask:\n TaskID: %d\n usage: %u.%u\n", 154 taskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 155 156 /* 获取指定任务在系统启动到现在的CPU占用率 */ 157 cpupUse = LOS_HistoryTaskCpuUsage(taskID, CPUP_LESS_THAN_1S); 158 printf("cpu usage of the cpupTestTask in all time:\n TaskID: %d\n usage: %u.%u\n", 159 taskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 160 161 return LOS_OK; 162} 163``` 164 165 166### 结果验证 167 168 编译运行得到的结果为: 169 170``` 171entry cpup test example 172the current system cpu usage is: 8.2 173the history system cpu usage in all time:8.9 174cpu usage of the cpupTestTask: 175 TaskID: 5 176 usage: 0.5 177cpu usage of the cpupTestTask in all time: 178 TaskID: 5 179 usage: 0.5 180 181exit cpup test example 182 183根据实际运行环境,上文中的数据会有差异,非固定结果 184``` 185