一、前言
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;
初始化后队列控制块的组织方式如下:
创建队列:队列用于存放具体的消息内容,任务可以调用LOS_QueueCreate()来创建队列,此时内核会根据入参指定的队列长度和消息大小申请内存创建队列,并从g_freeQueueList中分配一个控制块来管理队列,被分配的队列控制块状态为OS_QUEUE_INUSED。分配队列控制块时总是从头节点开始,如下图控制块0首先被分配用于管理新创建的队列。
写队列:内核支持两种写队列方式:从尾部写入LOS_QueueWrite()和 从头部写入LOS_QueueWriteHead():
读队列:读队列只有一种方