4

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区-51CTO.COM

 1 year ago
source link: https://ost.51cto.com/posts/18333
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、背景​

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

在轻量系统内核中,由于可用内存资源少,一般的数据资源都是小批量的,所以其资源管理方式都比较简单且相似,本文重点讲解在轻量系统内核中,典型的资源的存储和访问方式。这些典型的资源包括互斥锁,信号量、消息队列、事件、定时器等。

本文以互斥锁为例来探究其内核资源的主要管理方式。

互斥锁软件模块相关的代码在如下位置

​https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/src/los_mux.c​​​

​https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/include/los_mux.h​​​

二、模块使能和容量​

互斥锁软件模块是编译可裁剪模块,可以通过编译配置宏来打开或者关闭具体的编译配置宏定义在https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/include/los_config.h文件中

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

通过这个文件可知,liteos_m内核默认是使能互斥锁功能的,但我们根据具体产品可以对其进行设置,如某产品对应的配置文件https://gitee.com/openharmony/device_qemu/blob/master/arm_mps2_an386/liteos_m/board/target_config.h

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

这里明确看到此产品使用了互斥锁功能,如果需要将其关闭,直接修改成0值即可。

互斥锁支持的最大数目不同产品可以不同,当前这个产品为24,如果产品没有定义容量限制,那么使用默认容量限制(见los_config.h中)。

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

1.数据保存方式

由于容量较小,采用数组这种简单和原始的数据保存方式,在系统初始化的时候申请数组内存。如下(los_mux.c中)

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

三、数据访问方式​

由于轻量系统的计算资源相对受限,因此需要在算法上斤斤计较。目前提供了ID方式(数组下标访问)和链表访问2种方式,如下进行详细说明。

1. 通过ID访问

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

2.通过空闲链表访问

随着互斥锁的申请和释放,系统中当前正在使用的互斥锁数目是动态变化的。由于采用了数组存储以及内存预留的策略,所以数组中的互斥锁有些是空闲的,有些是正在使用的,并且其状态随着系统的运行过程而无规律地变化。

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

为了加快空闲互斥锁的查询,本系统采用了将所有空闲互斥锁组织成链表的方法。这样每次取出链表第一个节点即可,可以极大提升性能。

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

四、健壮性考虑​

1.空闲状态双保险

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

2.中断上下文保护

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

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

3.任务切换保护

IPC操作有时会需要任务切换,如果当前任务切换功能被临时关闭,则不允许进行IPC操作,互斥锁获取操作也是IPC操作的一种。

代码如下(los_mux.c): 

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

4.关键任务不允许切换

一些系统关键任务运行后,不允许执行IPC逻辑,比如软件定时器任务:其监控多个定时器的超时。假定其执行IPC逻辑导致任务等待某资源比较长的时间,会导致后续部分定时器定时功能失效(不准确)。代码如下(los_mux.c):

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

五、总结​

轻量系统中内核资源多采用数组与空闲链表相结合的方式。除了OpenHarmony轻量系统,其他嵌入式系统中这类的数据存储方式也比较常见。这种方式有如下几个突出的优点

● 简单易懂

● 读写效率高

● 代码紧凑

OpenHarmony轻量系统中内核资源主要管理方式​-开源基础软件社区

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK