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

在这里插入图片描述

目录

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

一、消息队列基本概念

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

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

  • 可以通过调整读队列和写队列的超时时间来调整读写接口的阻塞模式,如果将读队列和写队列的超时时间设置为 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.hqwc.cn/news/471662.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【方法】如何打开带密码的RAR分卷压缩文件?

RAR分卷文件是一种特殊的RAR压缩文件格式,也就是将文件压缩成多个相同大小的压缩包,可以更方便传输。那如果收到了带有密码的RAR分卷压缩文件,要如何打开呢? 无论RAR分卷压缩文件是否设置了密码保护,在打开或者解压分…

Javaweb基础-前端工程化学习笔记

前端工程化&#xff1a; 一.ES6 变量与模版字符串 let 和var的差别&#xff1a; <script>//1. let只有在当前代码块有效代码块. 代码块、函数、全局{let a 1var b 2} console.log(a); // a is not defined 花括号外面无法访问console.log(b); // 可以正常输出…

python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

1、视频推流 参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示:ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/…

【matalab】基于Octave的信号处理与滤波分析案例

一、基于Octave的信号处理与滤波分析案例 GNU Octave是一款开源软件&#xff0c;类似于MATLAB&#xff0c;广泛用于数值计算和信号处理。 一个简单的信号处理与滤波分析案例&#xff0c;说明如何在Octave中生成一个有噪声的信号&#xff0c;并设计一个滤波器来去除噪声。 首…

【刷题记录】合并两个有序数组、移除元素

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 1.题目链接&#xff1a; T1&#xff1a;LINK T2&#xff1a;LINK 2.详解思路&#xff1a; T1: 思路1&#xff1a;弄个新数组&#xff0c;比较两个数组中的值&#xff0c;哪个小就把哪个值放到新数组中。 分析1&a…

optee UTA加载

流程 动态TA按照存储位置的不同分为REE filesystem TA&#xff1a;存放在REE侧文件系统里的TA&#xff1b; Early TA&#xff1a;被嵌入到optee os里的在supplicant启动之前就可用了。 这里我们讲的是常规的存放在REE侧文件系统里的TA。 通过GP标准调用的与TA通信的命令(opens…

4.【Linux】进程控制(进程终止||进程等待||程序替换)

一.进程创建fork 见上篇文章 二.进程的终止 1.进程退出场景 1.代码运行完毕&#xff0c;结果正确&#xff0c;通过main函数退出码返回一般为0。 2.代码运行完毕&#xff0c;结果不正确&#xff0c;通过不同的退出码标识不同的错误原因。 3.代码异常终止&#xff08;信号&am…

模型 4R(关联、反应、关系、回报)理论

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。以关系促营销。 1 4R(关联、反应、关系、回报)理论的应用 1.1 4R模型在小米客户关系管理中的应用 小米公司是一家以生产智能手机和消费电子产品而闻名的公司&#xff0c;它在客户关系管理…

2022年12月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(判断题)

2022年12月Python编程等级考试二级真题解析 判断题(共10题,每题2分,共20分) 26、字典的元素可以通过键来访问,也可以通过索引(下标)来访问 答案:错 考点分析:考查字典相关知识,字典的元素只能通过键来访问,所以错误 27、Python中,可以通过索引来访问列表、字符串等…

常见的几种Web安全问题测试简介

Web项目比较常见的安全问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击。它指的是恶意攻击者往Web 页面里插入恶意html代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web 里面的html 代码会被执行&#xff0c;从而达到恶意用户的特殊…

现代化端口扫描工具RustScan

今天是大年初五&#xff0c;喜迎财神 &#xff0c;祝大家✔️顺风顺水 ✔️诸事如意 ✔️财源滚滚 ✔️大吉大利 顺便提一下&#xff0c;老苏的博客启用了新域名&#xff1a; https://laosu.tech 什么是 RustScan &#xff1f; RustScan 是一款现代化的端口扫描器。能快速找到端…

积分(一)——复化梯形积分(C++)

梯形积分 设f(x)在[a,b]上连续&#xff0c;若要计算其积分&#xff0c;则 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_a^b f(x)dx F(b) - F(a) ∫ab​f(x)dxF(b)−F(a) 其中F(x)为f(x)的原函数&#xff0c;但是计算机直接计算出该积分函数比较困难&#xff0c;因此需要近…