鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发

news2024/9/23 10:25:57

基本概念

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占用率 LOS_HistorySysCpuUsage:获取系统历史CPU占用率
获取任务CPU占用率LOS_TaskCpuUsage:获取指定任务CPU占用率 LOS_HistoryTaskCpuUsage:获取指定任务历史CPU占用率 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

根据实际运行环境,上文中的数据会有差异,非固定结果

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS 中 KVC 与 KVO 底层原理

KVC 本质: [object setValue: forKey:];即使没有在.h 文件中有property 的属性声明,setValue:forKey依然会按照上图流程执行代码 KVC 如果成功改变了成员变量,是一定可以被 KVO 监听到成员变量的前后改变的 KVO runtime会生成中间类&…

EmguCV学习笔记 C# 12.3 OCR

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

ActiveMQ 的消息持久化策略

ActiveMQ 的消息持久化策略 消息持久化对于可靠消息传递来说是一种比较好的方法,即使发送者和接受者不是同时在线,或者消息中心在发送者发送消息后宕机了,消息中心重启后仍然可以将消息发送出去。 消息持久性的原理很简单,就是在发…

[Linux] 通透讲解 什么是进程

标题:[Linux] 通透讲解 什么是进程 个人主页:水墨不写bug (图片来自网络) 目录 一.深入进程基本概念 二.管理好进程 1.管理好进程的方法 2.描述进程-PCB 3.组织进程 正文开始: 本文按照对进程的先描述再组织进行…

C++之模版的进阶

1.非类型模版参数 模版参数分类类型与非类型形形参 类型形参:出现在模版参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参:用一个常亮作为类(函数)模版的一个参数,在类(函数…

股指期货交割方式是什么?

说起股指期货,这可是个高大上的金融玩意儿。咱们平时买卖股票,那是看准了哪只股就下手,赚了就卖,赔了就扛,挺直接的。但股指期货呢,它玩的是未来的预期,就像是你跟人打赌明天天气好不好&#xf…

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2​​​​​​​ 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…

《python语言程序设计》2018版第8章18题几何circle2D类(中部)

第一、重新分析 第一-1、我设计的第一模式第一-1-1、遇到的逻辑分析迷雾第一-1-2、无畏挣扎后的无奈 第二-1、我就把你们两个放到一起,第二-2、我的想法 当我看到了这个2个园并且比对. 第一-1、我设计的第一模式 设计一个最抽象的Circle2D类. 这个类只包含一个x,y和circle 这个…

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布,这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2,还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进,其中最引人注目的当属 Parallels …

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』

免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』 哈喽小伙伴们好,我是Stark-C~ 想必很多小伙伴儿手机,电脑,甚至是网盘上都存取了大量的各类图片,不知道大家都是怎么管理你手头大量的图片的&…

食探秘:Spring Boot校园周边美食发现平台

第三章 系统设计 3.1 系统概要设计 本校园周边美食探索及分享平台选择B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式。适合在互联网上进行操作,只要用户能连网,任何时间、任何地点都可以进行系统的操作使用。系统工作原理图如图3-1所…

PMP--二模--解题--71-80

文章目录 13.干系人管理--干系人登记册--记录干系人的身份信息、评估信息、干系人分类。识别完干系人更新干系人登记册。71、 [单选] 一名初级项目经理被指派到一个新启动的项目,高级项目经理指示该初级项目经理去识别在项目中享有既得利益的人员。高级项目经理让初…

上半年营收净利双降,债台高筑下扩产能,天合光能“激进”前行?

近年来,随着新能源产业的蓬勃兴起,以及消费端对低碳经济追求的日益增强,再叠加分布式光伏发电系统的快速发展,全球市场对光伏组件的需求量愈发高涨。 而我国目前又是全球最大的光伏组件生产国和出口国,这离不开隆基绿…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法,特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里,然后对每个桶内的数据分别进行排序,最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数,因…

LLM大模型训练/推理的显卡内存需求计算

无论你是从头开始训练 LLM、对其进行微调还是部署现有模型,选择合适的 GPU 对成本和效率都至关重要。在这篇博客中,我们将详细介绍使用单个和多个 GPU 以及不同的优化器和批处理大小进行 LLM 训练和推理时 GPU 要求的所有信息。 计算机处理器由多个决定…

SM2无证书及隐式证书公钥机制签名和加密过程详解(一)

前面介绍SM2无证书及隐式证书公钥机制下用户公私密钥对的Python实现(具体参看SM2隐式证书用户公私钥生成python代码实现_sm2 python 密钥生成-CSDN博客),可以看到需由用户和KGC(可信密钥生成中心)共同参与才能计算得到…

小程序-基础知识1

Mustache语法 小程序和vue一样提供了插值语法 但是小程序不能调用方法{{xxxx()}} hidden属性 hidden是所有组件都默认拥有的属性, hidden与wx:if的区别: wx:if是控制组件是否渲染,hidden控制显示或隐藏是通过添加hidden属性。 wx:for 除了可以遍历…

服务器配置虚拟环境及离线安装python

本篇文章基于已经装好conda环境进行哈,不会安装conda可参考服务器离线安装anaconda-CSDN博客 1.打印现有虚拟环境列表 conda env list,可以看见我现在有base、ai、py38三个环境 2.删除指定虚拟环境 conda remove -n py38 --all,回车后输入ye…

LeetCode 面试经典150题 190.颠倒二进制位

复习知识:正数的原码、反码、补码相同,负数的反码在其原码的基础上, 符号位不变,其余各个位取反,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目:颠倒给定的 32 位无符号…