乐趣区

关于openharmony:OpenHarmony轻量系统中内核资源主要管理方式

一、背景

OpenAtom OpenHarmony(以下简称“OpenHarmony”)轻量零碎面向 MCU 类处理器例如 ARM Cortex-M、RISC-V 32 位的设施,硬件资源极其无限,反对的设施最小内存为 128KiB,能够提供多种轻量级网络协议,轻量级的图形框架,以及丰盛的 IOT 总线读写部件等。可撑持的产品如智能家居畛域的连贯类模组、传感器设施、穿戴类设施等。

在轻量零碎内核中,因为可用内存资源少,个别的数据资源都是小批量的,所以其资源管理形式都比较简单且类似,本文重点解说在轻量零碎内核中,典型的资源的存储和拜访形式。这些典型的资源包含互斥锁,信号量、音讯队列、事件、定时器等。

本文以互斥锁为例来探索其内核资源的次要治理形式。

互斥锁软件模块相干的代码在如下地位

https://gitee.com/openharmony…
https://gitee.com/openharmony…

二、模块使能和容量

互斥锁软件模块是编译可裁剪模块,能够通过编译配置宏来关上或者敞开具体的编译配置宏定义在 https://gitee.com/openharmony… 文件中

通过这个文件可知,liteos_m 内核默认是使能互斥锁性能的,但咱们依据具体产品能够对其进行设置,如某产品对应的配置文件 https://gitee.com/openharmony…

这里明确看到此产品应用了互斥锁性能,如果须要将其敞开,间接批改成 0 值即可。

互斥锁反对的最大数目不同产品能够不同,以后这个产品为 24,如果产品没有定义容量限度,那么应用默认容量限度(见 los_config.h 中)。

1. 数据保留形式

因为容量较小,采纳数组这种简略和原始的数据保留形式,在零碎初始化的时候申请数组内存。如下(los_mux.c 中)

三、数据拜访形式

因为轻量零碎的计算资源绝对受限,因而须要在算法上宽宏大量。目前提供了 ID 形式 (数组下标拜访) 和链表拜访 2 种形式,如下进行具体阐明。

  1. 通过 ID 拜访
    在 los_mux.h 中,定义了通过 id 拜访互斥锁的办法,其实质就是数组下标拜访,获取具体互斥锁资源的地址 

2. 通过闲暇链表拜访

随着互斥锁的申请和开释,零碎中以后正在应用的互斥锁数目是动态变化的。因为采纳了数组存储以及内存预留的策略,所以数组中的互斥锁有些是闲暇的,有些是正在应用的,并且其状态随着零碎的运行过程而无规律地变动。

若仅依赖于数组形式拜访互斥锁,则查问闲暇互斥锁是一个稍耗时的算法,因为要遍历数组。

为了放慢闲暇互斥锁的查问,本零碎采纳了将所有闲暇互斥锁组织成链表的办法。这样每次取出链表第一个节点即可,能够极大晋升性能。

在 los_mux.h 中,通过减少 muxList 字段将所有闲暇的互斥锁组织成链表
 

在 los_mux.c 中,零碎初始化时,所有互斥锁都为闲暇状态,放入闲暇链表 

在 los_mux.c 中,创立互斥锁时,从闲暇链表取下闲暇状态的互斥锁 

在 los_mux.c 中,开释互斥锁时,将互斥锁放入闲暇链表

四、健壮性思考

1. 闲暇状态双保险

除了通过判断是否在闲暇链表上来判断描述符是否闲暇以外,在构造体中也保留了是否闲暇的状态,这样能够减少闲暇状态判断的健壮性;另外,通过直接判断状态也比判断是否在链表中性能更高。如下(los_mux.c 中):
 

2. 中断上下文爱护

因为在中断上下文中不容许有睡眠操作,而互斥锁获取逻辑就是典型的具备睡眠操作的逻辑,所以,互斥锁的获取和开释不能在中断上下文中,如下(los_mux.c 中)。

 3. 工作切换爱护

IPC 操作有时会须要工作切换,如果当前任务切换性能被长期敞开,则不容许进行 IPC 操作,互斥锁获取操作也是 IPC 操作的一种。代码如下(los_mux.c):

4. 要害工作不容许切换

一些零碎要害工作运行后,不容许执行 IPC 逻辑,比方软件定时器工作:其监控多个定时器的超时。假设其执行 IPC 逻辑导致工作期待某资源比拟长的工夫,会导致后续局部定时器定时性能生效(不精确)。代码如下(los_mux.c):

五、总结

轻量零碎中内核资源多采纳数组与闲暇链表相结合的形式。除了 OpenHarmony 轻量零碎,其余嵌入式零碎中这类的数据存储形式也比拟常见。这种形式有如下几个突出的长处
● 简略易懂
● 读写效率高
● 代码紧凑

退出移动版