共计 1747 个字符,预计需要花费 5 分钟才能阅读完成。
一、背景
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 种形式,如下进行具体阐明。
- 通过 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 轻量零碎,其余嵌入式零碎中这类的数据存储形式也比拟常见。这种形式有如下几个突出的长处
● 简略易懂
● 读写效率高
● 代码紧凑