鸿蒙OpenHarmony【轻量系统内核扩展组件(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占用率 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: 5usage: 0.5
cpu usage of the cpupTestTask in all time:TaskID: 5usage: 0.5exit cpup test example根据实际运行环境,上文中的数据会有差异,非固定结果

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

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

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

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

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

鸿蒙面经

2

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

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

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

相关文章

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件,其中编辑一些配置文件,最常用的工具就是 Vim ,本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。…

告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件

前言 在这个快节奏的时代,我们每天都在忙碌中度过,手机虽然方便,但往往难以找到一整块时间来专心背单词。然而,你是否意识到,每天坐在电脑前的时间远比使用手机的时间要长?现在我们来介绍一个新型的学习软…

基于大数据的电子产品需求数据分析系统的设计与实现(Python Vue Flask Mysql)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候,发现了一些小小的问题,已经在 上述代码中体现。① 代码路径碰到中文的时候,会有乱码,需要转换(内容中…

浏览器插件利器--allWebPluginV2.0.0.20-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

我的AI工具箱Tauri版-VideoIntroductionClipCut视频介绍混剪

本教程基于自研的AI工具箱Tauri版进行VideoIntroductionClipCut视频介绍混剪。 本项目为自研的AI工具箱Tauri版中的视频剪辑模块,专注于自动生成视频介绍片段。该模块名为 VideoIntroductionClipCut,用户可以通过该工具快速进行视频的混剪和介绍内容的生…

【网络】高级IO——epoll版本TCP服务器初阶

目录 前言 一,epoll的三个系统调用接口 1.1.epoll_create函数 1.1.1.epoll_create函数干了什么 1.2. epoll_ctl函数 1.2.1.epoll_ctl函数函数干了什么 1.3.epoll_wait函数 1.3.1.epoll_wait到底干了什么 1.4.epoll的工作过程中内核在干什么 二,…

nginx upstream转发连接错误情况研究

本次测试用到3台服务器: 192.168.10.115:转发服务器A 192.168.10.209:upstream下服务器1 192.168.10.210:upstream下服务器2 1台客户端:192.168.10.112 服务器A中nginx主要配置如下: log_format main…

linux下共享内存的3种使用方式

进程是资源封装的单位,内存就是进程所封装的资源的一种。一般情况下,进程间的内存是相互隔离的,也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存,那么必须要进过内核这个桥梁,这就是…

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会,随着医疗服务需求的不断增长和医疗信息化的快速发展,提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…

Nginx 跨域 + 无法设置 Cookie 解决办法

今天来分享一下关于项目部署上线时怎么解决跨域问题!!! 首先感谢一下大佬的方法,才让这个困扰我很久的问题得以解决!!! 这也是我请教大佬才解决的问题,大佬和我说,这是他耗费两周才解决的问题,我这也是属于前人栽树后人乘凉了,嘿嘿嘿!!! 前端问题 前端没有携带 cookie 导致后端…

uni-app安装插件

1.通过插件市场安装https://ext.dcloud.net.cn 打开HBuilderX编辑器。 点击菜单栏中的“工具”->“插件安装”。 这里会看到已安装插件和安装新插件两个选项卡,点击安装新插件, 能看到一些核心插件,如果所需要的插件在核心插件里面有&…

1、vectorCast单元测试常用操作

一、自动创建测试工程 1、设置工作目录 进入软件主页面,点击file,选择set working directory,随便选择一个保存该项目的目录即可。 2、创建一个空工程 编译器选择vector自带的编译器,vectorCast MinGW C。 此时项目工程就创建好了 2.1、配置编译器节点 点击编译器节点…

KVM环境下制作ubuntu qcow2格式镜像

如果是Ubuntu KVM环境是VMware虚拟机,需要CPU开启虚拟化 1、配置镜像源 wget -O /etc/apt/sources.list https://www.qingtongqing.cc/ubuntu/sources.list2、安装kvm qemu-img libvirt kvm虚拟化所需环境组件 apt -y install qemu-kvm virt-manager libvirt-da…

Redisson 总结

1. 基础使用 1.1 引入依赖 <dependencies><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId></dependency> </dependencies>包含的依赖如下 1.2 配置文件 其实默认主机就…

Java基础总结(2)

1.实例方法和静态方法的区别 调用方式不同&#xff1a;静态方法可以通过类名.方法名直接调用&#xff0c;也可以通过当前类的实例对象.方法名来调用&#xff0c;但是实例方法只能通过后者来访问访问类的成员存在限制&#xff1a;在静态方法内部&#xff0c;只能访问类的静态成员…

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安&#xff0c; 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…

WPF DataGrid 单元格居中,头部居中,点击行改变背景色。

我得全局样式都写在了App.XAML文件下的ResourceDictionary里&#xff0c;方便全局引用 DataGrid样式和点击改变行背景色的触发器(BasedOn继承的是UI框架的样式&#xff0c;若无则删除&#xff0c;触发器还有鼠标移动事件等&#xff0c;按需自行修改添加) <Style x:Key&quo…

安卓13长按电源按键直接关机 andriod13不显示关机对话框直接关机

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有些设备需要在长按电源键的时候,直接关机。不需要弹出对话框进行询问。 2.问题分析 过滤电源按键,需要在系统里面处理的话,那么我们需要熟悉android的事件分发,然后再…

Golang | Leetcode Golang题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit : 0, 0, 0for _, ch : range password {if unicode.IsLower(ch) {hasLower 1} else if unicode.IsUpper(ch) {hasUpper 1} else if unicode.IsDigit(ch)…