HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-消息队列queue

news/2024/7/21 10:18:23 标签: harmonyos, 华为, OpenHarmony, LiteOS, 鸿蒙

在这里插入图片描述

目录

  • 一、消息队列基本概念
  • 二、消息队列运行机制
  • 三、消息队列开发流程
  • 四、消息队列使用说明
  • 五、消息队列接口
  • 六、代码分析(待续...)
  • 坚持就有收获

一、消息队列基本概念

  • 队列又称消息队列,是一种常用于任务间通信的数据结构。队列接收来自任务或中断的不固定长度消息,并根据不同的接口确定传递的消息是否存放在队列空间中。

  • 任务能够从队列里面读取消息,当队列中的消息为空时,挂起读取任务;当队列中有新消息时,挂起的读取任务被唤醒并处理新消息。任务也能够往队列里写入消息,当队列已经写满消息时,挂起写入任务;当队列中有空闲消息节点时,挂起的写入任务被唤醒并写入消息。

  • 可以通过调整读队列和写队列的超时时间来调整读写接口的阻塞模式,如果将读队列和写队列的超时时间设置为 0,就不会挂起任务,接口会直接返回,这就是非阻塞模式。反之,如果将都队列和写队列的超时时间设置为大于 0 的时间,就会以阻塞模式运行。

  • 消息队列提供了异步处理机制,允许将一个消息放入队列,但不立即处理。同时队列还有缓冲消息的作用,可以使用队列实现任务异步通信,队列具有如下特性:

    • 消息以先进先出的方式排队,支持异步读写。
    • 读队列和写队列都支持超时机制。
    • 每读取一条消息,就会将该消息节点设置为空闲。
    • 发送消息类型由通信双方约定,可以允许不同长度(不超过队列的消息节点大小)的消息。
    • 一个任务能够从任意一个消息队列接收和发送消息。
    • 多个任务能够从同一个消息队列接收和发送消息。
    • 创建队列时所需的队列空间,接口内系统自行动态申请内存。

二、消息队列运行机制

  • 创建队列时,创建队列成功会返回队列 ID。

  • 在队列控制块中维护着一个消息头节点位置 Head 和一个消息尾节点位置 Tail,用于表示当前队列中消息的存储情况。Head 表示队列中被占用的消息节点的起始位置。Tail 表示被占用的消息节点的结束位置,也是空闲消息节点的起始位置。队列刚创建时,Head 和 Tail 均指向队列起始位置。

  • 写队列时,根据 readWriteableCnt[1]判断队列是否可以写入,不能对已满(readWriteableCnt[1]为 0)队列进行写操作。写队列支持两种写入方式:向队列尾节点写入,也可以向队列头节点写入。尾节点写入时,根据 Tail 找到起始空闲消息节点作为数据写入对象,如果 Tail 已经指向队列尾部则采用回卷方式。头节点写入时,将 Head 的前一个节点作为数据写入对象,如果 Head 指向队列起始位置则采用回卷方式。

  • 读队列时,根据 readWriteableCnt[0]判断队列是否有消息需要读取,对全部空闲(readWriteableCnt[0]为 0)队列进行读操作会引起任务挂起。如果队列可以读取消息,则根据 Head 找到最先写入队列的消息节点进行读取。如果 Head 已经指向队列尾部则采用回卷方式。

  • 删除队列时,根据队列 ID 找到对应队列,把队列状态置为未使用,把队列控制块置为初始状态,并释放队列所占内存。

请添加图片描述

三、消息队列开发流程

  • 用 LOS_QueueCreate 创建队列。创建成功后,可以得到队列 ID。
  • 通过 LOS_QueueWrite 或者 LOS_QueueWriteCopy 写队列。
  • 通过 LOS_QueueRead 或者 LOS_QueueReadCopy 读队列。
  • 通过 LOS_QueueInfoGet 获取队列信息。
  • 通过 LOS_QueueDelete 删除队列。

四、消息队列使用说明

  • 系统支持的最大队列数是指:整个系统的队列资源总个数,而非用户能使用的个数。例如:系统软件定时器多占用一个队列资源,那么用户能使用的队列资源就会减少一个。
  • 创建队列时传入的队列名和 flags 暂时未使用,作为以后的预留参数。
  • 队列接口函数中的入参 timeOut 是相对时间。
  • LOS_QueueReadCopy 和 LOS_QueueWriteCopy 及 LOS_QueueWriteHeadCopy 是一组接口,LOS_QueueRead 和 LOS_QueueWrite 及 LOS_QueueWriteHead 是一组接口,每组接口需要配套使用。
  • 鉴于 LOS_QueueWrite 和 LOS_QueueWriteHead 和 LOS_QueueRead 这组接口实际操作的是数据地址,用户必须保证调用 LOS_QueueRead 获取到的指针所指向的内存区域在读队列期间没有被异常修改或释放,否则可能导致不可预知的后果。
  • LOS_QueueReadCopy 接口的读取长度如果小于消息实际长度,消息将被截断。
  • 鉴于 LOS_QueueWrite 和 LOS_QueueWriteHead 和 LOS_QueueRead 这组接口实际操作的是数据地址,也就意味着实际写和读的消息长度仅仅是一个指针数据,因此用户使用这组接口之前,需确保创建队列时的消息节点大小,为一个指针的长度,避免不必要的浪费和读取失败。

五、消息队列接口

功能类别接口函数描述
创建/删除消息队列LOS_QueueCreate创建一个消息队列,由系统动态申请队列空间
LOS_QueueCreateStatic创建一个消息队列,由用户分配队列内存空间传入接口
LOS_QueueDelete根据队列ID删除一个指定队列
读/写队列(不带拷贝)LOS_QueueRead读取指定队列头节点中的数据(队列节点中的数据实际上是一个地址)
LOS_QueueWrite向指定队列尾节点中写入入参bufferAddr的值(即buffer的地址)
LOS_QueueWriteHead向指定队列头节点中写入入参bufferAddr的值(即buffer的地址)
读/写队列(带拷贝)LOS_QueueReadCopy读取指定队列头节点中的数据
LOS_QueueWriteCopy向指定队列尾节点中写入入参bufferAddr中保存的数据
LOS_QueueWriteHeadCopy向指定队列头节点中写入入参bufferAddr中保存的数据
获取队列信息LOS_QueueInfoGet获取指定队列的信息,包括队列ID、队列长度、消息节点大小、头节点、尾节点、可读节点数量、可写节点数量、等待读操作的任务、等待写操作的任务、等待mail操作的任务

六、代码分析(待续…)

坚持就有收获

在这里插入图片描述


http://www.niftyadmin.cn/n/5377661.html

相关文章

OpenTitan- 开源安全芯片横空出世

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

开源力量:揭示开源软件如何成为技术演进与社会发展的引擎

文章目录 导言01 开源软件如何推动技术创新1.1 开放的创新模式1.2 快速迭代和反馈循环1.3 共享知识和资源1.4 生态系统的建设和扩展1.5 开放标准和互操作性 02 开源软件的商业模式2.1 支持和服务模式2.2 基于订阅的模式2.3 专有附加组件模式2.4 开源软件作为平台模式2.5 双重许…

Panalog 日志审计系统 sessiptbl.php 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统,方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sessiptbl.php接口处存在远程命令执行漏洞,攻击者可执行任意命令,接管服务器权限。 0x03 影响范围 version <= MARS r10p1Free 0x04 复现…

计算机视觉所需要的数学基础

计算机视觉领域中使用的数学知识广泛而深入&#xff0c;以下是一些关键知识点及其在计算机视觉中的应用&#xff1a; 线性代数&#xff1a; - 矩阵运算&#xff1a;用于图像的表示和处理&#xff0c;如图像旋转、缩放、裁剪等。 - 向量空间&#xff1a;用于描述图像中的…

windows vs 自己编译源码 leveldb 然后使用自己编译的文件

1 准备源码文件 1.1 第一种方法 git下载源码 vs项目中git leveldb源码和git third_party googletest-CSDN博客 1.2 第二种方法 手动下载 然后把第三方的源码下载 复制到 third_party 对应的文件夹中 没有文件夹 third_party -> powershell mkdir third_party 2 编译lev…

Qt:自定义信号,信号emit,传参问题,信号槽与moc

一、自定义信号&#xff0c;信号emit 1、自定义信号 在头文件中 加入signals&#xff1a; 就可以编写信号 2、emit emit的作用是通知信号发生 二、跨UI控件传参 每次按Dialog添加按钮主控件数字会增长 // .h private slots:void on_btnAdd_clicked(); signals:void sign…

MongoDB聚合:$graphLookup

$graphLookup聚合阶段在一个集合中执行递归搜索&#xff0c;可以使用选项来控制递归搜索的深度和条件。 $graphLookup搜索过程总结如下&#xff1a; 输入文档进入$graphLookup聚合阶段。$graphLookup的搜索目标是from参数指定的集合&#xff08;搜索参数的完整列表见下文&…

VueCLI核心知识1:ref属性、props配置、mixin混入

1 ref 属性 ref属性类似于js原生获取DOM元素 <template><div><h1 v-text"msg" ref"title"></h1><button click"showDom">点我输出上方的Dom元素</button><School ref"sch"></School>…