首页 > 其他分享 >OpenHarmony 实战开发——内核IPC机制数据结构解析

OpenHarmony 实战开发——内核IPC机制数据结构解析

时间:2024-09-03 09:52:33浏览次数:10  
标签:PC机 OpenHarmony LOS 队列 信号量 互斥 任务 内核 数据结构


一、前言

OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。

作为面向全场景、全连接、全智能的分布式泛终端操作系统,OpenHarmony通过将各类不同终端设备的能力进行整合,实现硬件互助、资源共享,为用户提供流畅的全场景体验。为了能适应各种硬件,OpenHarmony提供了LiteOS、Linux内核,并基于这些内核形成了不同的系统类型,同时又在这些系统中构建了一套统一的系统能力。

OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,LiteOS-M核为任务间通信提供了多种机制,包括队列、事件、互斥锁和信号量。各机制涉及到哪些关键数据结构?这些数据结构又是如何工作的?接下来我将从队列、事件、互斥锁、信号量几个内核对象出发,为大家讲解内核IPC机制的数据结构。

二、数据结构–队列

队列又称消息队列,是一种常用于任务间通信的数据结构,可以在任务间传递消息内容或消息的地址。内核用队列控制块来管理消息队列,同时又使用双向环形链表来管理控制块。

队列控制块:管理具体消息队列的数据块,内核初始化时调用OsQueueInit()创建,并依次挂载到双向环形链表g_freeQueueList中,此时控制块状态为OS_QUEUE_UNUSED,队列控制块用来保存队列的状态,队列长度、消息长度、队列ID、队列头尾位置和等待读写的任务列表,内核就是根据这些信息来管理消息队列和任务完成对消息读写等操作。

typedef struct {
           UINT8 *queue;
           UINT16 queueState;
           UINT16 queueLen;
           UINT16 queueSize;
           UINT16 queueID;
           UINT16 queueHead;
           UINT16 queueTail;
           UINT16 readWriteableCnt[OS_READWRITE_LEN];
           LOS_DL_LIST readWriteList[OS_READWRITE_LEN];
           LOS_DL_LIST memList;
   }LosQueueCB;

初始化后队列控制块的组织方式如下:

OpenHarmony 实战开发——内核IPC机制数据结构解析_鸿蒙内核

创建队列:队列用于存放具体的消息内容,任务可以调用LOS_QueueCreate()来创建队列,此时内核会根据入参指定的队列长度和消息大小申请内存创建队列,并从g_freeQueueList中分配一个控制块来管理队列,被分配的队列控制块状态为OS_QUEUE_INUSED。分配队列控制块时总是从头节点开始,如下图控制块0首先被分配用于管理新创建的队列。

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_02

写队列:内核支持两种写队列方式:从尾部写入LOS_QueueWrite()和 从头部写入LOS_QueueWriteHead():

OpenHarmony 实战开发——内核IPC机制数据结构解析_ArkUI_03

读队列:读队列只有一种方式,从队列头部读LOS_QueueRead(),读取之后head指向下个节点。

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_04

删除队列:当不再使用队列时可以使用LOS_QueueDelete()来删除队列,此时会归还队列控制块到g_freeQueueList中,并释放消息队列:

OpenHarmony 实战开发——内核IPC机制数据结构解析_数据结构_05

三、数据结构–事件

事件用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输,事件控制块由任务申请,内核负责维护。

事件控制块:事件控制块用来记录事件和管理等待读取事件的任务。uwEventID总共32bit代表31个事件(bit25保留),stEventList事件控制块的双向环形链表,当有任务读取事件但事件还没发生时任务会被挂载链表中,当事件发生时系统唤醒等待事件的任务,此时任务就会被摘出链表。

typedef struct tagEvent {
      UINT32 uwEventID;      
      LOS_DL_LIST stEventList; 
  } EVENT_CB_S, *PEVENT_CB_S;

事件初始化:事件控制块由任务创建,然后调用LOS_EventInit()进行初始化,初始化后的状态如下:

OpenHarmony 实战开发——内核IPC机制数据结构解析_嵌入式硬件_06

事件读:当事件没有发生时,读事件操作会引发系统调度,把当前任务挂起并加入到stEventList链表,下图中事件1发生,任务Task1读取事件2,但是事件2没有发生导致Task1被挂起。

OpenHarmony 实战开发——内核IPC机制数据结构解析_鸿蒙内核_07

事件写:当事件2发生时,任务Task2把事件2写入uwEventID,此时任务Task1被调度读取事件成功,事件2对应bit位被清0(也可以不清0),Task1从链表stEventList中被摘出。

OpenHarmony 实战开发——内核IPC机制数据结构解析_数据结构_08

事件删除:事件控制块是由任务创建的,内核不负责控制块的删除,但是任务可以调用LOS_EventClear来清除事件。

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_09

四、数据结构–互斥锁

互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。任意时刻互斥锁的状态只有开锁或闭锁,当有任务持有时,互斥锁处于闭锁状态,任务获得该互斥锁的所有权;当该任务释放它时,互斥锁被开锁,任务失去该互斥锁的所有权;当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有。

互斥锁控制块:互斥锁控制块资源由内核创建和维护,内核初始化时会调用函数OsMuxInit()对锁资源进行初始化。等待互斥锁的任务会被挂载到muxList中。

typedef struct {
        UINT8 muxStat;       /**< State OS_MUX_UNUSED,OS_MUX_USED  */
        UINT16 muxCount;     /**< Times of locking a mutex */
        UINT32 muxID;        /**< Handle ID */
        LOS_DL_LIST muxList; /**< Mutex linked list */
        LosTaskCB *owner;    /**< The current thread that is locking a mutex */
        UINT16 priority;     /**< Priority of the thread that is locking a mutex */
} LosMuxCB;

初始化时内核会申请LOSCFG_BASE_IPC_MUX_LIMIT个锁资源,并把各资源块挂载到双向环形链表g_unusedMuxList中,全局变量g_allMux指向锁资源内存首地址,后续根据首地址加ID方式快速查找对应的控制块:

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_10

互斥锁创建:任务调用LOS_MuxCreate()创建互斥锁,内核会从g_unusedMuxList的头部分配一个锁资源给任务。

OpenHarmony 实战开发——内核IPC机制数据结构解析_嵌入式硬件_11

互斥锁申请:任务调用LOS_MuxPend()申请互斥锁,如果锁被其它任务持有,则任务在muxList上排队。

OpenHarmony 实战开发——内核IPC机制数据结构解析_数据结构_12

互斥锁释放:任务调用LOS_MuxPost()释放互斥锁,如果有其它任务排队,则触发调度释放锁给排队任务。

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_13

互斥锁删除:任务调用LOS_MuxDelete()删除互斥锁,如果删除成功锁资源被归还到g_unusedMuxList中。

OpenHarmony 实战开发——内核IPC机制数据结构解析_ArkUI_14

五、数据结构–信号量

信号量实现任务之间同步或临界资源的互斥访问的一种同步机制,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。

信号量控制块:信号量控制块资源由内核创建和维护,内核初始化时会调用函数OsSemInit()对信号量资源进行初始化。初始化时申请LOSCFG_BASE_IPC_SEM_LIMIT个信号量控制块,g_allSem指向信号量控制块的首地址,创建好的信号量控制块会挂载到空闲链表g_unusedSemList中。申请信号量的任务会在控制块的链表semList上排队,semCount指示可以被访问的资源数。

typedef struct {
           UINT16 semStat;      /**< Semaphore state */
           UINT16 semCount;     /**< Number of available semaphores */
           UINT16 maxSemCount;  /**< Max number of available semaphores */
           UINT16 semID;        /**< Semaphore control structure ID */
           LOS_DL_LIST semList; /**< Queue of tasks that are waiting on a semaphore */
   } LosSemCB;

信号量创建:任务调用LOS_SemCreate()创建信号量,并指定同一时刻访问此资源的最大任务数目。内核从g_unusedSemList的头部分配一个信号量控制块并初始化。

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_15

信号量申请:任务调用LOS_MuxPend()申请信号量,如果有资源可以访问则申请成功,否则在semList上排队等候。

OpenHarmony 实战开发——内核IPC机制数据结构解析_鸿蒙内核_16

信号量释放:任务调用LOS_SemPost()释放信号量,如果有其它任务排队,则触发调度使排队任务访问资源。

OpenHarmony 实战开发——内核IPC机制数据结构解析_嵌入式硬件_17

信号量删除:任务调用LOS_SemDelete()删除信号量,如果删除成功,锁资源被归还到g_unusedSemList的头部。

OpenHarmony 实战开发——内核IPC机制数据结构解析_数据结构_18

六、总结

本篇文章通过数据结构的队列、事件、互斥锁、信号量四大方面对内核IPC机制数据结构进行解析,希望以上的讲解能给大家建立一个IPC机制的整体认识。

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

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

OpenHarmony 实战开发——内核IPC机制数据结构解析_鸿蒙内核_19

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

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

OpenHarmony 实战开发——内核IPC机制数据结构解析_嵌入式硬件_20

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_21

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

OpenHarmony 实战开发——内核IPC机制数据结构解析_嵌入式硬件_22

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

OpenHarmony 实战开发——内核IPC机制数据结构解析_数据结构_23

OpenHarmony 开发环境搭建

OpenHarmony 实战开发——内核IPC机制数据结构解析_鸿蒙内核_24

《OpenHarmony源码解析》

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

OpenHarmony 实战开发——内核IPC机制数据结构解析_openHarmony_25

OpenHarmony 设备开发学习手册

OpenHarmony 实战开发——内核IPC机制数据结构解析_数据结构_26



标签:PC机,OpenHarmony,LOS,队列,信号量,互斥,任务,内核,数据结构
From: https://blog.51cto.com/u_15375308/11906240

相关文章

  • OpenHarmony中的HDF单链表及其迭代器
    概念为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构。单链表是链表中的一种,本文描述OpenAtomOpenHarmony(以下简称“OpenHarmony”)中HDF软件模块自己定义的单链表,并学习其设计和实现方法。其中包含一些......
  • [数据结构] 循环队列
    front:头指针rear:尾指针maxsize:数组长度循环队列通常会让留空数组中的一位,区分队列为空和队列为满的状态。入队移动rear,出队移动front。形式1(默认):front指向队头元素的前一位,而rear指向队尾元素。队列为空:front==rear队列为满:front==(rear+1)%maxsize元素个数:(r......
  • 数据结构与算法(链表)
    目录单链表结构线性表的链式存储结构 链式存储实现链表创建创建同时赋值尾结点插入任意节点插入获取某位置的地址输出链表元素删除某位置节点删除链表返回某元素位置对链表元素冒泡排序对链表元素排序单链表结构将线性表L=(a0,a1,……,an-1)中各元素分布在......
  • 25版王道数据结构课后习题详细分析 第六章 图 6.4图的应用
    一、单项选择题————————————————————————————————————————解析:正确答案:————————————————————————————————————————解析:正确答案:—————————————————————......
  • 25版王道数据结构课后习题详细分析 第六章 图 6.2图的遍历
    一、单项选择题————————————————————————————————————————解析:广度优先搜索以起始结点为中心,一层一层地向外层扩展遍历图的顶点,因此无法考虑到边权值,只适合求边权值相等的图的单源最短路径。广度优先搜索相当于树的层序遍历,选项Ⅲ......
  • 数据结构与算法——符号表API设计及有序符号表设计
    Java学习手册+面试指南:https://javaxiaobear.cn符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。符号表中,键具有唯一性。符号表的应用:应用查找目的键值字典找出单词的释义单词释义图......
  • 算法与数据结构——二叉树
    二叉树二叉树(binarytree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。structTreeNode{ intval; //节点值 TreeNode*left; //左子结点指......
  • 【C语言】数据结构-栈(顺序表实现)
    文章目录前言1.什么是栈2.栈的实现3.敲代码!3.1头文件3.2函数实现4.知识巩固,来道OJ!结语前言在之前的数据结构学习中,我们学习了顺序表、链表这两种结构顺序表:博客链接1单链表:博客链接2链表OJ:博客链接3除了单链表以外,还有一个结构,是双向带头循环链表。这个链表的形式如下头节点的......
  • redis-数据结构数据类型
    redis常见数据类型作者:xxxRedis共有5种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。数据类型底层数据结构应用场景StringSDS它可以存储任何数据-字符串、整数、浮点值、JPEG图像、序列化的Ruby对象或您希望它承载的任何其他......
  • OpenHarmony轻量系统中内核资源主要管理方式
    一、背景OpenAtomOpenHarmony(以下简称“OpenHarmony”)轻量系统面向MCU类处理器例如ARMCortex-M、RISC-V32位的设备,硬件资源极其有限,支持的设备最小内存为128KiB,可以提供多种轻量级网络协议,轻量级的图形框架,以及丰富的IOT总线读写部件等。可支撑的产品如智能家居领域的连接类模组......