一、前言
随着数字经济的发展,作为数字基础设施根技术的操作系统成为数字变革的关键力量,OpenAtom OpenHarmony(以下简称“OpenHarmony”) 以泛智能终端数字为底座支撑着千行百业的产业生态。构建开源生态,需要让开发者先用起来,本文希望通过分享 OpenHarmony 的 LiteOS-M 内核对象队列的算法详解,让大家对这一算法有更加清晰的认识。OpenHarmony 当前分为以下几种系统类型:轻量系统 、小型系统、标准系统。针对不同量级的系统,分别使用了不同形态的内核。在轻量系统上,可以选择 LiteOS-M;在小型系统和标准系统上,可以选用 LiteOS-A;在标准系统上,可以选用 Linux。在轻小型系统中,OpenHarmony 所使用的内核为 LiteOS,在标准系统中使用 Linux。LiteOS-M 在面向 loT 领域构建了一款轻量级物联网操作系统内核,嵌入式从业者如果能更好地掌握内核相关的知识,就能在未来做研发或者定制产品的时候独当一面。
二、关键数据结构
首先关注队列的关键数据结构 LosQueueCB,有了这个数据,才能理解队列是如何工作的:
typedef struct {
*queue:指向消息节点内存区域,创建队列时按照消息节点个数乘每个节点大小从动态内存池中申请一片空间。
queueState:队列状态,表明队列控制块是否被使用,有 OS_QUEUE_INUSED和OS_QUEUE_UNUSED 两种状态。
queueLen:消息节点个数,表示该消息队列最大可存储多少个消息。
queueSize:每个消息节点大小,表示队列每个消息可存储信息的大小。
queueID:消息 ID,通过它来操作队列。
消息节点按照循环队列的方式访问,队列中的每个节点以数组下标表示,下面的成员与消息节点循环队列有关:
queueHead:循环队列的头部。
queueTail:循环队列的尾部。
readWriteableCnt[OS_QUEUE_WRITE]:消息节点循环队列中可写的消息个数,为 0 表示循环队列为满,等于 queueLen 表示循环队列为空。
readWriteableCnt[OS_QUEUE_READ]:消息节点循环队列中可读的消息个数,为 0 表示循环队列为空,等于 queueLen 表示消息队列为满。
readWriteList[OS_QUEUE_WRITE]:写消息阻塞链表,链接因消息队列满而无法写入时需要挂起