目录
- 一、CPU 占用率
- 1.1、CPU 占用率基本概念
- 1.2、CPU 占用率运行机制
- 1.3、CPU 占用率开发流程
- 二、动态加载
- 2.1、 动态加载基本概念
- 2.2、动态加载运行机制
- 坚持就有收获
一、CPU 占用率
1.1、CPU 占用率基本概念
CPU(中央处理器,Central Processing Unit)占用率分为系统 CPU 占用率和任务 CPU 占用率。
系统 CPU 占用率(CPU Percent)是指周期时间内系统的 CPU 占用率,用于表示系统一段时间内的闲忙程度,也表示 CPU 的负载情况。系统 CPU 占用率的有效表示范围为 0~100,其精度(可通过配置调整)为百分比。100 表示系统满负荷运转。
任务 CPU 占用率指单个任务的 CPU 占用率,用于表示单个任务在一段时间内的闲忙程度。任务 CPU 占用率的有效表示范围为 0~100,其精度(可通过配置调整)为百分比。100 表示在一段时间内系统一直在运行该任务。
用户通过系统级的 CPU 占用率,判断当前系统负载是否超出设计规格。通过系统中各个任务的 CPU 占用情况,判断各个任务的 CPU 占用率是否符合设计的预期。
1.2、CPU 占用率运行机制
OpenHarmony LiteOS-M 的 CPUP(CPU Percent,系统 CPU 占用率)采用任务级记录的方式,在任务切换时,记录任务启动时间,任务切出或者退出时间,每次当任务退出时,系统会累加整个任务的占用时间。
可以在 target_config.h 的中对该功能进行选配。
OpenHarmony LiteOS-M 提供以下两种 CPU 占用率的信息查询:
- 系统 CPU 占用率。
- 任务 CPU 占用率。
CPU 占用率的计算方法:
- 系统 CPU 占用率=系统中除 idle 任务外其他任务运行总时间/系统运行总时间
- 任务 CPU 占用率=任务运行总时间/系统运行总时间
1.3、CPU 占用率开发流程
- 调用获取系统 CPU 使用率函数 LOS_SysCpuUsage。
- 调用获取系统历史 CPU 使用率函数 LOS_HistorySysCpuUsage。
- 调用获取指定任务 CPU 使用率函数 LOS_TaskCpuUsage。
- 若任务已创建,则关中断,正常获取,恢复中断;
- 若任务未创建,则返回错误码;
- 调用获取指定任务历史 CPU 使用率函数 LOS_HistoryTaskCpuUsage。
- 若任务已创建,则关中断,根据不同模式正常获取,恢复中断;
- 若任务未创建,则返回错误码;
- 调用获取所有任务 CPU 使用率函数 LOS_AllCpuUsage。
- 若 CPUP 已初始化,则关中断,根据不同模式正常获取,恢复中断;
- 若 CPUP 未初始化或有非法入参,则返回错误码;
二、动态加载
2.1、 动态加载基本概念
在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M 选择业界标准的ELF 加载方案,方便拓展算法生态。LiteOS-M 提供类似于 dlopen、dlsym 等接口,APP 通过动态加载模块提供的接口可以加载、卸载相应算法库。如图 1 所示,APP 需要通过三方算法库所需接口获取对应信息输出,三方算法库又依赖内核提供的基本接口,如 malloc 等。APP加载所需接口,并对相关的未定义符号完成重定位后,APP 即可调用该接口完成功能调用。目前动态加载组件只支持 arm 架构。此外,待加载的共享库需要验签或者限制来源,确保系统的安全性。
2.2、动态加载运行机制
共享库调用内核接口需要内核主动暴露动态库所需的接口,如图 2 所示,该机制将符号信息编译到指定段中,调用 SYM_EXPORT 宏即可完成对指定符号的信息导出。符号信息通过结构体 SymInfo 描述,成员包括符号名和符号地址信息,宏 SYM_EXPORT 通过__attribute__编译属性将符号信息导入.sym.*段中。
加载过程中,根据 ELF 文件的句柄以及程序头表的段偏移可以得到需要加载到内存的 LOAD段,一般有两个段,只读段及读写段,如下所示,可以用 readelf -l 查看 ELF 文件的 LOAD 段信息。根据相应的对齐属性申请物理内存,通过每个段的加载基址及偏移将代码段或数据段写入内存中。
通过 ELF 文件的.dynamic 段获取重定位表,遍历表中每一个需要重定位的条目,再根据需要重定位的符号名在共享库和内核提供的导出符号表中查找相应符号并更新相应的重定位信息。
ELF 支持类型:
编译共享库时,添加-fPIC 可以编译出位置无关代码(-fPIC 为编译选项),此时共享库文件类型为 ET_DYN,其可以加载至任意有效的地址区间。
例:arm-none-eabi-gcc -fPIC –shared –o lib.so lib.c。
ELF 共享库编译链接选项:
- “-nostdlib”编译链接选项:不依赖编译器中 lib 库。
- “-nostartfiles”编译链接选项:不依赖编译器中启动相关的文件。
- “-fPIC”编译选项:可编译位置无关的共享库。
- “-z max-page-size=4”链接选项:二进制文件中可加载段的对齐字节数为 4,可节约内存,可用于动态库。
- “-mcpu=”需要指定对应的 cpu 架构。
约束:
- 不支持应用程序加载,只支持共享库加载。
- 待加载的共享库不能依赖编译器中的 libc 库及其他共享库,只能依赖内核提供的对外接口(由导出的符号表提供)。
- 依赖交叉编译器及文件系统。