OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 持续更新中……

基本概念

Perf为性能分析工具,依赖PMU(Performance Monitoring Unit)对采样事件进行计数和上下文采集,统计出热点分布(hot spot)和热路径(hot path)。

运行机制

基于事件采样原理,以性能事件为基础,当事件发生时,相应的事件计数器溢出发生中断,在中断处理函数中记录事件信息,包括当前的pc、当前运行的任务ID以及调用栈等信息。

Perf提供2种工作模式,计数模式和采样模式。

计数模式仅统计事件发生的次数和耗时,采样模式会收集上下文数据到环形buffer中,需要IDE进行数据解析生成热点函数与热点路径。

接口说明

OpenHarmony LiteOS-A内核的Perf模块提供下面几种功能,接口详细信息可以查看 API 参考。

表1 Perf模块接口说明

功能分类接口描述
开启/停止Perf采样LOS_PerfInit : 初始化Perf
LOS_PerfStart:开启采样
LOS_PerfStop:停止采样
配置Perf采样事件LOS_PerfConfig:配置采样事件的类型、周期等
读取采样数据LOS_PerfDataRead:读取采样数据到指定地址
注册采样数据缓冲区的钩子函数LOS_PerfNotifyHookReg:注册缓冲区水线到达的处理钩子
LOS_PerfFlushHookReg:注册缓冲区刷cache的钩子
  1. Perf采样事件的结构体为PerfConfigAttr,详细字段含义及取值详见  kernel\include\los_perf.h 。

  2. 采样数据缓冲区为环形buffer,buffer中读过的区域可以覆盖写,未被读过的区域不能被覆盖写。

  3. 缓冲区有限,用户可通过注册水线到达的钩子进行buffer溢出提醒或buffer读操作。默认水线值为buffer总大小的1/2。 示例如下:

    VOID Example_PerfNotifyHook(VOID){CHAR buf[LOSCFG_PERF_BUFFER_SIZE] = {0};UINT32 len;PRINT_DEBUG("perf buffer reach the waterline!\n");len = LOS_PerfDataRead(buf, LOSCFG_PERF_BUFFER_SIZE);OsPrintBuff(buf, len); /* print data */}LOS_PerfNotifyHookReg(Example_PerfNotifyHook);c
  1. 若perf采样的buffer涉及到CPU跨cache,则用户可通过注册刷cache的钩子,进行cache同步。 示例如下:
    VOID Example_PerfFlushHook(VOID *addr, UINT32 size){OsCacheFlush(addr, size); /* platform interface */}LOS_PerfNotifyHookReg(Example_PerfFlushHook);c

刷cache接口视具体的平台自行配置。

开发指导

内核态开发流程

开启Perf调测的典型流程如下:

  1. 配置Perf模块相关宏。 配置Perf控制宏LOSCFG_KERNEL_PERF,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Perf Feature"中打开:
配置项menuconfig选项含义设置值
LOSCFG_KERNEL_PERFEnable Perf FeaturePerf模块的裁剪开关YES/NO
LOSCFG_PERF_CALC_TIME_BY_TICKTime-consuming Calc Methods->By TickPerf计时单位为tickYES/NO
LOSCFG_PERF_CALC_TIME_BY_CYCLETime-consuming Calc Methods->By Cpu CyclePerf计时单位为cycleYES/NO
LOSCFG_PERF_BUFFER_SIZEPerf Sampling Buffer SizePerf采样buffer的大小INT
LOSCFG_PERF_HW_PMUEnable Hardware Pmu Events for Sampling使能硬件PMU事件,需要目标平台支持硬件PMUYES/NO
LOSCFG_PERF_TIMED_PMUEnable Hrtimer Period Events for Sampling使能高精度周期事件,需要目标平台支持高精度定时器YES/NO
LOSCFG_PERF_SW_PMUEnable Software Events for Sampling使能软件事件,需要开启LOSCFG_KERNEL_HOOKYES/NO
  1. 调用LOS_PerfConfig配置需要采样的事件。 Perf提供2种模式的配置,及3大类型的事件配置:

    2种模式:计数模式(仅统计事件发生次数)、采样模式(收集上下文如任务ID、pc、backtrace等)。

    3种事件类型:CPU硬件事件(cycle、branch、icache、dcache等)、高精度周期事件(cpu clock)、OS软件事件(task switch、mux pend、irq等)。

  2. 在需要采样的代码起始点调用LOS_PerfStart(UINT32 sectionId), 入参sectionId标记不同的采样回话id。

  3. 在需要采样的代码结束点调用LOS_PerfStop。

  4. 调用输出缓冲区数据的接口LOS_PerfDataRead读取采样数据,并使用IDE工具进行解析。

内核态编程实例

本实例实现如下功能:

  1. 创建perf测试任务。

  2. 配置采样事件。

  3. 启动perf。

  4. 执行需要统计的算法。

  5. 停止perf。

  6. 输出统计结果。

内核态示例代码

前提条件:在menuconfig菜单中完成perf模块的配置, 并勾选Enable Hook Feature,Enable Software Events for Sampling。

为方便学习,本演示代码直接在 . kernel /liteos_a/testsuites /kernel /src /osTest.c中编译验证即可。

实例代码如下:

#include "los_perf.h"
#define TEST_MALLOC_SIZE 200
#define TEST_TIME        5/* 验证函数中进行malloc和free */
VOID test(VOID)
{VOID *p = NULL;int i;for (i = 0; i < TEST_TIME; i++) {p = LOS_MemAlloc(m_aucSysMem1, TEST_MALLOC_SIZE);if (p == NULL) {PRINT_ERR("test alloc failed\n");return;}(VOID)LOS_MemFree(m_aucSysMem1, p);}
}STATIC VOID OsPrintBuff(const CHAR *buf, UINT32 num)
{UINT32 i = 0;PRINTK("num: ");for (i = 0; i < num; i++) {PRINTK(" %02d", i);}PRINTK("\n");PRINTK("hex: ");for (i = 0; i < num; i++) {PRINTK(" %02x", buf[i]);}PRINTK("\n");
}
STATIC VOID perfTestHwEvent(VOID)
{UINT32 ret;CHAR *buf = NULL;UINT32 len;//LOS_PerfInit(NULL, 0);PerfConfigAttr attr = {.eventsCfg = {.type        = PERF_EVENT_TYPE_SW,.events = {[0]      = {PERF_COUNT_SW_TASK_SWITCH, 0xff}, /* 抓取调度 */[1]      = {PERF_COUNT_SW_MEM_ALLOC, 0xff},   /* 抓取内存分配 */PERF_COUNT_SW_TASK_SWITCH},.eventsNr    = 2,.predivided  = 1,             /* cycle counter increase every 64 cycles */},.taskIds         = {0},.taskIdsNr       = 0,.needSample      = 0,.sampleType      = PERF_RECORD_IP | PERF_RECORD_CALLCHAIN,};ret = LOS_PerfConfig(&attr);if (ret != LOS_OK) {PRINT_ERR("perf config error %u\n", ret);return;}PRINTK("------count mode------\n");LOS_PerfStart(0);test(); /* this is any test function*/LOS_PerfStop();PRINTK("--------sample mode------ \n");attr.needSample = 1;LOS_PerfConfig(&attr);LOS_PerfStart(2); // 2: set the section id to 2.test(); /* this is any test function*/LOS_PerfStop();buf = LOS_MemAlloc(m_aucSysMem1, LOSCFG_PERF_BUFFER_SIZE);if (buf == NULL) {PRINT_ERR("buffer alloc failed\n");return;}/* get sample data */len = LOS_PerfDataRead(buf, LOSCFG_PERF_BUFFER_SIZE);OsPrintBuff(buf, len); /* print data */(VOID)LOS_MemFree(m_aucSysMem1, buf);
}UINT32 Example_Perf_test(VOID)
{UINT32 ret;TSK_INIT_PARAM_S perfTestTask = {0};UINT32 taskID;/* 创建用于perf测试的任务 */perfTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)perfTestHwEvent;perfTestTask.pcName       = "TestPerfTsk";    /* 测试任务名称 */perfTestTask.uwStackSize  = 0x1000; // 0x8000: perf test task stack sizeperfTestTask.usTaskPrio   = 5; // 5: perf test task priorityret = LOS_TaskCreate(&taskID, &perfTestTask);if (ret != LOS_OK) {PRINT_ERR("PerfTestTask create failed. 0x%x\n", ret);return LOS_NOK;}return LOS_OK;
}
LOS_MODULE_INIT(perfTestHwEvent, LOS_INIT_LEVEL_KMOD_EXTENDED);
c
内核态结果验证

输出结果如下:

type: 2
events[0]: 1, 0xff
events[1]: 3, 0xff
predivided: 1
sampleType: 0x60
needSample: 0
------count mode------
[task switch] eventType: 0x1 [core 0]: 0
[mem alloc] eventType: 0x3 [core 0]: 5
time used: 0.005000(s)
--------sample mode------
type: 2
events[0]: 1, 0xff
events[1]: 3, 0xff
predivided: 1
sampleType: 0x60
needSample: 1
dump perf data, addr: 0x402c3e6c length: 0x5000
time used: 0.000000(s)
num:  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
hex:  00 ffffffef ffffffef ffffffef 02 00 00 00 14 00 00 00 60 00 00 00 02 00 00 00根据实际运行环境,过程打印会有差异
  • 针对计数模式,系统在perf stop后会打印: 事件名称(cycles)、事件类型(0xff)、事件发生的次数(5466989440)。

    当采样事件为硬件PMU事件时,打印的事件类型为实际的硬件事件id,非enum PmuHWId中定义的抽象类型。

  • 针对采样模式,系统在perf stop后会打印采样数据的地址和长度: dump section data, addr: (0x8000000) length: (0x5000)

用户可以通过JTAG口导出该片内存,再使用IDE线下工具解析。

或者通过LOS_PerfDataRead将数据读到指定地址,进行查看或进一步处理。示例中OsPrintBuff为测试接口,其按字节打印Read到的采样数据,num表示第几个字节,hex表示该字节中的数值。

粉丝反馈

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

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

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

相关文章

Qt --- 常用控件的介绍 --- 其他控件

一、QPushButton QWidget中设计到的各种属性/函数/使用方法&#xff0c;针对接下来要介绍的Qt的各种控件都是有效的。 使用QPushButton表示一个按钮&#xff0c;这也是当前我们最熟悉的一个控件了。这个类继承了QAbstractButton&#xff0c;这个类是一个抽象类&#xff0c;是…

C++自动驾驶面试核心问题整理

应用开发 概述&#xff1a;比较基础&#xff0c;没啥壁垒&#xff0c;主要有linux开发经验即可 问题&#xff1a;基础八股&#xff0c;如计算机网络、操作系统、c11等基础三件套&#xff1b;中等难度算法题1-2道。 中间件开发&#xff08;性能优化&#xff09; 概述&am…

Set 和 Map 的模拟实现

1、引言 在数据结构与算法的学习与实践中&#xff0c;关联容器&#xff08;associative containers&#xff09;是不可忽视的重要工具。作为高效管理数据的一类容器&#xff0c;C 标准库中的 set 和 map 在现代软件开发中扮演着关键角色。这两个容器通过平衡二叉搜索树&#x…

【通讯协议】S32K142芯片——LIN通信的学习和配置

文章目录 前言1.LIN是什么&#xff1f;2. LIN连接结构及节点构成3. 帧的组成3.1 帧头3.1.1 同步间隔场&#xff08;Break&#xff09;3.1.2 同步场&#xff08;Synch&#xff09;3.1.3 标识符场&#xff08;PID&#xff09; 3.2 帧响应3.2.1 数据场3.2.2 校验和场 3. 代码配置总…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.6 处理器架构2 函数

新的架构来了&#xff0c;本游戏的最后一个攻略分享&#xff0c;最后汇编部分无非是对于操作码的熟练&#xff0c;硬件没有问题&#xff0c;那么也就无关痛痒了。 汇编实现&#xff0c;两数相或和两数相与非一起相与即可。 八位异或器&#xff0c;整就完事了。 有手就行。 利…

干货满满:嵌入式电阻的重要作用全知晓

在嵌入式开发中&#xff0c;有一个小小的元件&#xff0c;它看似不起眼&#xff0c;却在电路中扮演着极其重要的角色。它就是——电阻。很多初学者认为电阻只是用来“分压降流”&#xff0c;但其实&#xff0c;电阻的作用远比我们想象的要复杂和关键。今天&#xff0c;我们就来…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。 图…

思科安全网络解决方案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }

【C++篇】走进C++标准模板库:STL的奥秘与编程效率提升之道

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割

目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接&#xff1a;https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据&#xff0c;其中包含大量少数/尾部类别&#xff0c;这些类…

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包&#xff0c;并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…

TaskRes: Task Residual for Tuning Vision-Language Models

文章汇总 当前VLMs微调中存在的问题 提示微调的问题 在提示调优中缺乏对先验知识保存的保证(me&#xff1a;即提示微调有可能会丢失预训练模型中的通用知识)。虽然预先训练的文本分支模块(如文本编码器和投影)的权重在提示调优范式中被冻结&#xff0c;但原始的良好学习的分类…

BUUCTF-MISC-荷兰宽带数据泄露

下载附件得到一个二进制文件 通过题目猜测这是一段路由器备份日志&#xff0c;可以使用RouterPassView打开 链接: https://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k 下载链接http://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k注意&#xff0c;这个软件会报毒…

struts2 S2-057远程执行代码漏洞 靶场攻略

环境 vulhub靶场 /struts2/s2-057 漏洞简介 漏洞产⽣于⽹站配置XML时如果没有设置namespace的值&#xff0c;并且上层动作配置中并没有设置 或使⽤通配符namespace时&#xff0c;可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没 有设置value和action的值&…

react + antDesign封装图片预览组件(支持多张图片)

需求场景&#xff1a;最近在开发后台系统时经常遇到图片预览问题&#xff0c;如果一个一个的引用antDesign的图片预览组件就有点繁琐了&#xff0c;于是在antDesign图片预览组件的基础上二次封装了一下&#xff0c;避免重复无用代码的出现 效果 公共预览组件代码 import React…

JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞

vulhub/jboss/JMXInvokerServlet-deserialization 1. 此漏洞存在于JBoss中 /invoker/JMXInvokerServlet 路径。访问若提示下载 JMXInvokerServlet&#xff0c;则可能存在漏洞&#xff1a; #创建class⽂件 javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCol…

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…

DPDK 简易应用开发之路 3:实现ping(ARP ICMP 协议)

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 网卡IP为192.168.131.153 mac地址 00 0c 29 00 04 4d 理论基础 机器A内部没有机器B的物理地址&#xff0c;则 A ping B 的时候需要先发 arp 请求&#xff0c;以获取机器 B 的 MAC 地址。 获取 MAC 地址 如果 A 和 …