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.mzph.cn/news/683640.shtml

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

相关文章

BossPlayerCTF

靶场环境问题 靶场下载之后,可能会出现扫描不到IP的情况,需要进行调整,参考: Vulnhub靶机检测不到IP地址_vulnhub靶机nmap扫不到-CSDN博客 该靶机没有vim,需要使用vi命令去修改;改成当前网卡即可&#x…

第21讲关于我们页面实现

关于我们页面实现 关于锋哥页面author.vue 我们这里用一个vip宣传页面&#xff0c;套一个web-view <template><web-view src"http://www.java1234.com/vip.html"></web-view> </template><script> </script><style> <…

【Java多线程案例】定时器

1. 定时器简介 定时器&#xff1a;想必大家一定对定时器这个概念不陌生&#xff01;因为它经常出现在我们的日常生活和编程学习中&#xff0c;定时器就好比是一个"闹钟"&#xff0c;会在指定时间处理某件事&#xff08;例如响铃&#xff09;&#xff0c;而在编程世界…

删除 Windows 设备和驱动器中的 WPS网盘、百度网盘等快捷图标

在安装诸如WPS软件、百度云盘、爱奇艺等客户端后&#xff0c;Windows 的“我的电脑”&#xff08;或“此电脑”&#xff09;中的“设备和驱动器”部分会出现对应的软件图标。这种情况被许多技术人员视为不必要的干扰&#xff0c;因此许多用户想要知道如何隐藏或删除这些图标。 …

【初中生讲机器学习】9. 我是怎么用朴素贝叶斯实现垃圾邮件分类的?真的超全!

创建时间&#xff1a;2024-02-14 最后编辑时间&#xff1a;2024-02-15 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

leetcode刷题之或操作使用场景

文章目录 概要题目问题分析小结 概要 今天晚上上床前刷了一个leetcode的题目&#xff0c;是leetcode的2103题&#xff0c;因为是个简单题&#xff0c;我只是想复习一下hash表的用法。结果反而让我看到了或操作的使用场景。 题目 总计有 n 个环&#xff0c;环的颜色可以是红、…

Zabbix图形中文乱码问题(显示口口)解决办法

一 切换到zabbix安装目录assets/fonts下&#xff0c;下载字体 这里使用是nginxphp作为zabbix-web展示&#xff0c;使用find 命令查找 进入目录下&#xff0c;将原有字体备份&#xff0c;下载msyh字体 wget https://www.xxshell.com/download/sh/zabbix/ttf/msyh.ttf 二 修改配…

[GYCTF2020]Blacklist

感觉是[强网杯 2019]随便注 的加强版&#xff0c;之前做的是最后可以通过prepare和execute实现对select的绕过&#xff0c;但是这题把这两个关键字也过滤了。 前面堆叠注入没啥问题&#xff0c;卡在了最后读取flag 查看其他师傅的wp&#xff0c;发现这个handler的可以当作丐版s…

CPU-GPU异构并行化APSP算法

一、Floyd-Warshall算法 介绍 Floyd-Warshall算法&#xff08;英语&#xff1a;Floyd-Warshall algorithm&#xff09;&#xff0c;中文亦称弗洛伊德算法或佛洛依德算法&#xff0c;是解决任意两点间的最短路径的一种算法&#xff0c;可以正确处理有向图或负权&#xff08;但…

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时&#xff0c;浏览器会弹出一个小恐龙&#xff0c;当我们点击它时游戏就会开始进行&#xff0c;大家也可以玩一下试试&#xff0c;网址&#xff1a;恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…

FileZilla Server 1.8.1内网搭建

配置环境服务器服务器下载服务器配置服务器配置 Server - ConfigureServer Listeners - Port 协议设置 Protocols settingsFTP and FTP over TLS(FTPS) Rights management(权利管理)Users(用户) 客户端建立连接 配置环境 服务器处于局域网内: 客户端 < -访问- > 公网 &l…

[嵌入式系统-17]:RT-Thread -3- 源代码目录结构

目录 前言&#xff1a;功能模块 一、RT-Thread 源代码目录结构 二、支持的CPU架构 三、SRC内核代码 前言&#xff1a;功能模块 一、RT-Thread 源代码目录结构 从RT-Thread的GitHub官网上面下载了内核源码&#xff0c;下载链接如下 https://github.com/RT-Thread/rt-thread…

HarmonyOS 通过getInspectorByKey获取指定元素高宽等属性

例如 这里 我们有这样一个组件 Entry Component struct Dom {build() {Column() {Row() {Circle({ width: 200, height: 200 }).fill(#20101010)}.id(ES)}.width(100%).height(100%)} }这里 我们就写了个很基本的组件结构 然后 我们写了个 Circle 组件 定义了宽高 然后 如果我…

数据接收程序

#include<reg51.h> //包含单片机寄存器的头文件 sbit pPSW^0; /***************************************************** 函数功能&#xff1a;接收一个字节数据 ***************************************************/ unsigned char Receive(void) { unsigned…

116. 填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到…

Flink理论—容错之状态

Flink理论—容错之状态 在 Flink 的框架中&#xff0c;进行有状态的计算是 Flink 最重要的特性之一。所谓的状态&#xff0c;其实指的是 Flink 程序的中间计算结果。Flink 支持了不同类型的状态&#xff0c;并且针对状态的持久化还提供了专门的机制和状态管理器。 Flink 使用…

7 大 Android 数据恢复软件,可轻松找回丢失的数据

每年&#xff0c;由于各种原因&#xff0c;数百万人从他们的 Android 设备中丢失数据。它可能像意外删除文件一样简单&#xff0c;也可能像系统崩溃一样复杂。在这种情况下&#xff0c;拥有高效的数据恢复工具可以证明是救命稻草。Mac 用户尤其需要找到与其系统兼容的软件。好消…

不止于浏览器:掌握Node.js,开启全栈开发新篇章!

介绍&#xff1a;Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;特别适合构建高性能的网络服务器和实时应用。具体介绍如下&#xff1a; 服务器端JavaScript&#xff1a;Node.js的核心优势之一是在服务器端运行JavaScript&#xff0c;这使得前端开发者可以…

如何利用SpringSecurity进行认证与授权

目录 一、SpringSecurity简介 1.1 入门Demo 二、认证 ​编辑 2.1 SpringSecurity完整流程 2.2 认证流程详解 2.3 自定义认证实现 2.3.1 数据库校验用户 2.3.2 密码加密存储 2.3.3 登录接口实现 2.3.4 认证过滤器 2.3.5 退出登录 三、授权 3.1 权限系统作用 3.2 授…

软件实例分享,门诊处方软件存储模板处方笺教程,个体诊所电子处方开单系统软件教程

软件实例分享&#xff0c;门诊处方软件存储模板处方笺教程&#xff0c;个体诊所电子处方开单系统软件教程、 一、前言 以下软件教程以 佳易王诊所电子处方管理软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 电子处方软件支持病历汇总…