# CPUå 用率 ## 基本概念 CPU(ä¸å¤®å¤„ç†å™¨ï¼ŒCentral Processing Unit)å 用率分为系统CPUå 用率和任务CPUå 用率。 **系统CPUå 用率**:是指周期时间内系统的CPUå 用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPUå 用率的有效表示范围为0~100,其å•ä½ä¸ºç™¾åˆ†æ¯”。100表示系统满负è·è¿è½¬ã€‚ **任务CPUå 用率**:指å•个任务的CPUå 用率,用于表示å•个任务在一段时间内的闲忙程度。任务CPUå 用率的有效表示范围为0~100,其å•ä½ä¸ºç™¾åˆ†æ¯”。100表示在一段时间内系统一直在è¿è¡Œè¯¥ä»»åŠ¡ã€‚ 用户通过系统级的CPUå 用率,判æ–当å‰ç³»ç»Ÿè´Ÿè½½æ˜¯å¦è¶…å‡ºè®¾è®¡è§„æ ¼ã€‚ 通过系统ä¸å„个任务的CPUå 用情况,判æ–å„个任务的CPUå 用率是å¦ç¬¦åˆè®¾è®¡çš„预期。 æ¤å¤–å¼€å¯CPUP的情况下,å¯é€‰æ‹©å¼€å¯ä¸æ–å 用率统计。 **䏿–å 用率**:是指å•ä¸ªä¸æ–åœ¨å…¨éƒ¨ä¸æ–消耗时间的å 用率。å 用率的有效表示范围为0~100。100表示在一段时间内仅触å‘è¯¥ä¸æ–。 ## è¿è¡Œæœºåˆ¶ OpenHarmony LiteOS-Mçš„CPUP(CPU Percent,系统CPUå 用率)采用任务级记录的方å¼ï¼Œåœ¨ä»»åŠ¡åˆ‡æ¢æ—¶ï¼Œè®°å½•任务å¯åŠ¨æ—¶é—´ï¼Œä»»åŠ¡åˆ‡å‡ºæˆ–è€…é€€å‡ºæ—¶é—´ï¼Œæ¯æ¬¡å½“ä»»åŠ¡é€€å‡ºæ—¶ï¼Œç³»ç»Ÿä¼šç´¯åŠ æ•´ä¸ªä»»åŠ¡çš„å 用时间。 å¯ä»¥åœ¨target_config.hçš„ä¸å¯¹è¯¥åŠŸèƒ½è¿›è¡Œé€‰é…。 OpenHarmony LiteOS-Mæä¾›ä»¥ä¸‹ä¸¤ç§CPUå ç”¨çŽ‡çš„ä¿¡æ¯æŸ¥è¯¢ï¼š - 系统CPUå 用率。 - 任务CPUå 用率。 æ¤å¤–,系统还æä¾›äº†ä¸æ–å ç”¨çŽ‡çš„ä¿¡æ¯æŸ¥è¯¢èƒ½åŠ›ï¼ˆéœ€åŒæ—¶å¼€å¯CPUP和定时器)。 **å 用率的计算方法:** 系统CPUå 用率=系统ä¸é™¤idle任务外其他任务è¿è¡Œæ€»æ—¶é—´/系统è¿è¡Œæ€»æ—¶é—´ 任务CPUå 用率=任务è¿è¡Œæ€»æ—¶é—´/系统è¿è¡Œæ€»æ—¶é—´ 䏿–å 用率=å•ä¸ªä¸æ–è¿è¡Œæ—¶é—´/䏿–è¿è¡Œæ€»æ—¶é—´ ## 接å£è¯´æ˜Ž **表1** 功能列表 | 功能分类 | æŽ¥å£æè¿° | | -------- | -------- | | 获å–系统CPUå 用率 | LOS_SysCpuUsage:获å–当å‰ç³»ç»ŸCPUå 用率<br/> LOS_HistorySysCpuUsage:获å–系统历å²CPUå 用率 | | 获å–任务CPUå 用率 | LOS_TaskCpuUsageï¼šèŽ·å–æŒ‡å®šä»»åŠ¡CPUå 用率<br/> LOS_HistoryTaskCpuUsageï¼šèŽ·å–æŒ‡å®šä»»åŠ¡åŽ†å²CPUå 用率<br/> LOS_AllTaskCpuUsageï¼šèŽ·å–æ‰€æœ‰ä»»åŠ¡CPUå 用率 | | 输出任务CPUå 用率 | LOS_CpupUsageMonitor:输出任务历å²CPUå 用率 | | 获å–䏿–CPUå 用率 | LOS_GetAllIrqCpuUsageï¼šèŽ·å–æ‰€æœ‰ä¸æ–CPUå 用率 | ## 开呿µç¨‹ 在kernel/liteos_m目录下执行 make menuconfig 命令é…ç½®"Kernel->Enable Cpup"䏿‰“å¼€YESå¼€å¯ä»»åŠ¡cpupï¼› å¼€å¯åŽå‡ºçŽ°æ–°é€‰é¡¹â€œEnable Cpup include irqâ€æ‰“å¼€YESå¼€å¯ä¸æ–cpup。 CPUå ç”¨çŽ‡çš„å…¸åž‹å¼€å‘æµç¨‹ï¼š 1. 调用获å–系统CPUå 用率函数LOS_SysCpuUsage。 2. 调用获å–系统历å²CPUå 用率函数LOS_HistorySysCpuUsage。 3. è°ƒç”¨èŽ·å–æŒ‡å®šä»»åŠ¡CPUå 用率函数LOS_TaskCpuUsage。 - è‹¥ä»»åŠ¡å·²åˆ›å»ºï¼Œåˆ™å…³ä¸æ–,æ£å¸¸èŽ·å–,æ¢å¤ä¸æ–ï¼› - 若任务未创建,则返回错误ç ï¼› 4. è°ƒç”¨èŽ·å–æŒ‡å®šä»»åŠ¡åŽ†å²CPUå 用率函数LOS_HistoryTaskCpuUsage。 - è‹¥ä»»åŠ¡å·²åˆ›å»ºï¼Œåˆ™å…³ä¸æ–ï¼Œæ ¹æ®ä¸åŒæ¨¡å¼æ£å¸¸èŽ·å–,æ¢å¤ä¸æ–ï¼› - 若任务未创建,则返回错误ç ï¼› 5. è°ƒç”¨èŽ·å–æ‰€æœ‰ä»»åŠ¡CPUå 用率函数LOS_AllCpuUsage。 - è‹¥CPUPå·²åˆå§‹åŒ–ï¼Œåˆ™å…³ä¸æ–ï¼Œæ ¹æ®ä¸åŒæ¨¡å¼æ£å¸¸èŽ·å–,æ¢å¤ä¸æ–ï¼› - è‹¥CPUP未åˆå§‹åŒ–æˆ–æœ‰éžæ³•å…¥å‚,则返回错误ç ï¼› ## 编程实例 ### 实例æè¿° 本实例实现如下功能: 1. 创建一个用于CPUP测试的任务。 2. 获å–当å‰ç³»ç»ŸCPUP。 3. 以ä¸åŒæ¨¡å¼èŽ·å–历å²ç³»ç»ŸCPUP。 4. 获å–创建的测试任务的CPUP。 5. 以ä¸åŒæ¨¡å¼èŽ·å–创建的测试任务的CPUP ### 示例代ç 剿æ¡ä»¶ï¼š 在kernel/liteos_m目录下执行 make menuconfig命令é…ç½®"Kernel->Enable Cpup"ä¸å¼€å¯ä»»åŠ¡cpup: 代ç 实现如下: 本演示代ç 在 ./kernel/liteos_m/testsuites/src/osTest.c ä¸ç¼–译验è¯ï¼Œåœ¨TestTaskEntryä¸è°ƒç”¨éªŒè¯å…¥å£å‡½æ•°ExampleCpup。 ``` #include "los_task.h" #include "los_cpup.h" #define TEST_TASK_PRIO 5 #define TASK_DELAY_TIME 100 VOID CpupTask(VOID) { printf("entry cpup test example\n"); usleep(TASK_DELAY_TIME); usleep(TASK_DELAY_TIME); printf("exit cpup test example\n"); } UINT32 ExampleCpup(VOID) { UINT32 ret; UINT32 cpupUse; UINT32 taskID; TSK_INIT_PARAM_S cpupTestTask = { 0 }; cpupTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)CpupTask; cpupTestTask.pcName = "TestCpupTsk"; cpupTestTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; cpupTestTask.usTaskPrio = TEST_TASK_PRIO; ret = LOS_TaskCreate(&taskID, &cpupTestTask); if(ret != LOS_OK) { printf("cpupTestTask create failed .\n"); return LOS_NOK; } usleep(TASK_DELAY_TIME); /* 获å–当å‰ç³»ç»ŸCPUå 用率 */ cpupUse = LOS_SysCpuUsage(); printf("the current system cpu usage is: %u.%u\n", cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); /* 获å–当å‰ç³»ç»Ÿåކå²CPUå 用率 */ cpupUse = LOS_HistorySysCpuUsage(CPUP_LESS_THAN_1S); printf("the history system cpu usage in all time:%u.%u\n", cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); /* èŽ·å–æŒ‡å®šä»»åŠ¡çš„CPUå 用率 */ cpupUse = LOS_TaskCpuUsage(taskID); printf("cpu usage of the cpupTestTask:\n TaskID: %d\n usage: %u.%u\n", taskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); /* èŽ·å–æŒ‡å®šä»»åŠ¡åœ¨ç³»ç»Ÿå¯åŠ¨åˆ°çŽ°åœ¨çš„CPUå 用率 */ cpupUse = LOS_HistoryTaskCpuUsage(taskID, CPUP_LESS_THAN_1S); printf("cpu usage of the cpupTestTask in all time:\n TaskID: %d\n usage: %u.%u\n", taskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); return LOS_OK; } ``` ### ç»“æžœéªŒè¯ ç¼–è¯‘è¿è¡Œå¾—到的结果为: ``` entry cpup test example the current system cpu usage is: 8.2 the history system cpu usage in all time:8.9 cpu usage of the cpupTestTask: TaskID: 5 usage: 0.5 cpu usage of the cpupTestTask in all time: TaskID: 5 usage: 0.5 exit cpup test example æ ¹æ®å®žé™…è¿è¡ŒçŽ¯å¢ƒï¼Œä¸Šæ–‡ä¸çš„æ•°æ®ä¼šæœ‰å·®å¼‚,éžå›ºå®šç»“æžœ ```