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.mfbz.cn/a/388901.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Json-序列化字符串时间格式问题

序列化字符串时间格式问题 一、项目场景二、问题描述三、解决方案 一、项目场景 最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson(){DataTable dt new DataTable();dt.Columns.Add("Age", Type.GetType("Sys…

【数据库】哪些操作会导致索引失效

🍎个人博客:个人主页 🏆个人专栏:数据库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在数据库管理中,索引的有效性对于查询性能至关重要。然而,索引可能会因为各种操…

插值(一)——多项式插值(C++)

插值 插值的作用是可以将原本比较难计算的函数转换为误差在一定范围内的多项式,比如在单片机中直接计算 x 、 log ⁡ 2 x \sqrt{x}、\log_2x x ​、log2​x之类的函数是比较麻烦的,但是使用插值的方法就可以将其转换为误差可控的只有乘法和加减法的多项…

Codeforces Round 926 (Div. 2)

Codeforces Round 926 (Div. 2) Codeforces Round 926 (Div. 2) A. Sasha and the Beautiful Array 题意&#xff1a;略。 思路&#xff1a;从小到大排序&#xff0c;取前后差和。 AC code&#xff1a; void solve() {int ans 0;cin >> n;for (int i 1; i < n…

iOS AlDente 1.0自动防过充, 拯救电池健康度

经常玩iOS的朋友可能遇到过长时间过充导致的电池鼓包及健康度下降问题。MacOS上同样会出现该问题&#xff0c;笔者用了4年的MBP上周刚拿去修了&#xff0c;就是因为长期不拔电源的充电&#xff0c;开始还是电量一半的时候不接电源会黑屏无法开机&#xff0c;最后连着电源都无法…

模拟算法总结(Java)

目录 模拟算法概述 练习 练习1&#xff1a;替换所有的问号 练习2&#xff1a;提莫攻击 练习3&#xff1a;Z字形变换 模拟算法概述 模拟&#xff1a;根据题目要求的实现过程进行编程模拟&#xff0c;即题目要求什么就实现什么 解决这类题目&#xff0c;需要&#xff1a; 1…

C#,二分法(Bisection Method)求解方程的算法与源代码

1 二分法 二分法是一种分治算法&#xff0c;是一种数学思维。 对于区间[a&#xff0c;b]上连续不断且f&#xff08;a&#xff09;f&#xff08;b&#xff09;<0的函数yf&#xff08;x&#xff09;&#xff0c;通过不断地把函数f&#xff08;x&#xff09;的零点所在的区间…

【STM32 CubeMX】GPIO的工作模式

文章目录 前言一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 总结 前言 在嵌入式系统开发中&#xff0c;对于STM32微控制器的GPIO&#xff08;General Purpose Input/Output&#xff09;引脚的配置和使用是至关重要的。GPIO引脚可以通…

从C向C++8——多态

一.多态基础 面向对象程序设计语言有封装、继承和多态三种机制&#xff0c;这三种机制能够有效提高程序的可读性、可扩充性和可重用性。 “多态&#xff08;polymorphism&#xff09;”指的是同一名字的事物可以完成不同的功能。多态可以分为编译时的多态和运行时的多态。前者主…

Linux之动静态库

今天我们来讲动静态库&#xff01; 首先我们来粗粒度的划分一下动态库和静态库。 动态库就是只有一份库文件&#xff0c;所有想用该库的文件与改库文件建立链接&#xff0c;然后使用。这样可以提高代码复用率&#xff0c;避免重复拷贝产生没必要的内存消耗。 静态库&#xf…

京东购物拉新保姆级教程

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

【Java多线程】Thread类的基本用法

目录 Thread类 1、创建线程 1.1、继承 Thread&#xff0c;重写run 1.2、实现 Runnable&#xff0c;重写run 1.3、使用匿名内部类&#xff0c;继承 Thread&#xff0c;重写run 1.4、使用匿名内部类&#xff0c;实现 Runnable&#xff0c;重写run 1.5、使用 lambda 表达式…

如何在30天内使用python制作一个卡牌游戏

如何在30天内使用python制作一个卡牌游戏 第1-5天&#xff1a;规划和设计第6-10天&#xff1a;搭建游戏框架第11-20天&#xff1a;核心游戏机制开发第21-25天&#xff1a;游戏界面和用户体验第26-30天&#xff1a;测试和发布附加建议游戏类型游戏规则设计界面设计技术选型第6-…

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

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

Rust 数据结构与算法:5栈:用栈实现前缀、中缀、后缀表达式

3、前缀、中缀和后缀表达式 计算机是从左到右处理数据的&#xff0c;类似(A (B * C))这样的完全括号表达式&#xff0c;计算机如何跳到内部括号计算乘法&#xff0c;然后跳到外部括号计算加法呢&#xff1f; 一种直观的方法是将运算符移到操作数外&#xff0c;分离运算符和操…

【Java从入门到精通】Java变量命名规则

Java 变量命名规则 在 Java 中&#xff0c;不同类型的变量&#xff08;例如实例变量、局部变量、静态变量等&#xff09;有一些命名规则和约定。 遵循一些基本规则&#xff0c;这有助于提高代码的可读性和维护性。 以下是各种变量命名规则的概述&#xff1a; 使用有意义的名…

第13章 网络 Page733 “I/O对象”的链式传递 单独的火箭发射函数

把main函数中火箭发射代码挪走一些&#xff0c;构成一个单独的火箭发射函数launch_rocket()&#xff0c;如下图所示&#xff1a; 代码&#xff1a; 之所以没有将io_service对象也挪到launch_rocket()函数中&#xff0c;是因为正常的asio程序肯定还会有大量的其他异步操作需要这…

C++ 图上 bfs(五十八)【第五篇】

今天我们来学习一下图上bfs。 1.图上bfs 在图上&#xff0c;我们也可以进行 BFS&#xff0c;也可以解决图上 DFS 能解决的问题&#xff0c;比如连通块。 除此以外&#xff0c;根据 BFS 的性质&#xff0c;第一次到一个点的时候记下来的步数一定是到从起点到这个点的最小步数&…

Linux第56步_根文件系统第3步_将busybox构建的根文件系统烧录到EMMC

1、第1次将“rootfs”打包 1)、打开第1个终端&#xff0c;准备在“mnt”目录下创建挂载目录“rootfs”&#xff1b; 输入“ls回车” 输入“cd /mnt回车” 输入“ls回车”&#xff0c;查看“mnt”目录下的文件和文件夹 输入“sudo mkdir rootfs回车”&#xff0c;在“mnt”…

核心篇-OSPF技术之序(下)

文章目录 一. 实验专题1.1. 实验1&#xff1a;配置OSPF特殊区域1.1.1. 实验目的1.1.2. 实验拓扑图1.1.3. 实验步骤&#xff08;1&#xff09;配置IP地址&#xff08;2&#xff09;创建环回口&#xff08;3&#xff09;查看路由表&#xff08;4&#xff09;设置Stub区域&#xf…
最新文章