• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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占用率 | &nbsp;LOS_SysCpuUsage:获取当前系统CPU占用率<br/>&nbsp;LOS_HistorySysCpuUsage:获取系统历史CPU占用率 |
50| 获取任务CPU占用率 | &nbsp;LOS_TaskCpuUsage:获取指定任务CPU占用率<br/>&nbsp;LOS_HistoryTaskCpuUsage:获取指定任务历史CPU占用率<br/>&nbsp;LOS_AllTaskCpuUsage:获取所有任务CPU占用率 |
51| 输出任务CPU占用率 | LOS_CpupUsageMonitor:输出任务历史CPU占用率 |
52| 获取中断CPU占用率 | LOS_GetAllIrqCpuUsage:获取所有中断CPU占用率 |
53
54## 开发流程
55
56kernel/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
101kernel/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