【LiteOS】LiteOS消息队列
前言
链接
参考
- 野火
- 上面链接
笔录草稿
- 最近工作有点忙,远吗阅读推迟了哈哈
基本概念
队列又称消息队列
- 是一种常用于任务间通信的数据结构
- 能接收来自任务或中断的不固定长度的消息
- 根据不同的 API 选择传递消息是否存放在自己空间
- 即是 传数据 还是 传地址
- 任务能够从队列里面读取消息
- 当队列中的消息是空时
- 挂起读取任务
- 当队列中有新消息时
- 挂起的读取任务被唤醒
- 并处理新消息。
- 当队列中的消息是空时
LiteOS 队列特性
- 消息以先进先出方式排队(FIFO),支持异步读写工作方式
- 读队列和写队列都支持超时机制
- 发送消息类型由通信双方约定,可以允许不同长度(不超过队列节点最大值)消息
- 一个任务能够从任意一个消息队列接收和发送消息
- 多个任务能够从同一个消息队列接收和发送消息
- 当队列使用结束后,如果是动态申请的内存,需要通过释放内存函数回收。
队列运作机制
- 队列控制块
usReadWriteableCnt
: 可读或可写的消息数量stReadWriteList
: 可读或可写的消息任务等待链表usQueueState
: 两种状态- OS_QUEUE_UNUSED : 未被使用
- OS_QUEUE_INUSED : 已被使用
/**
* @ingroup los_queue
* Queue information block structure
*/
typedef struct tagQueueCB
{
UINT8 *pucQueue; /**< Pointer to a queue handle */
UINT16 usQueueState; /**< Queue state */
UINT16 usQueueLen; /**< Queue length */
UINT16 usQueueSize; /**< Node size */
UINT16 usQueueID; /**< usQueueID */
UINT16 usQueueHead; /**< Node head */
UINT16 usQueueTail; /**< Node tail */
UINT16 usReadWriteableCnt[2]; /**< Count of readable or writable resources, 0:readable, 1:writable */
LOS_DL_LIST stReadWriteList[2]; /**< Pointer to the linked list to be read or written, 0:readlist, 1:writelist */
LOS_DL_LIST stMemList; /**< Pointer to the memory linked list */
} QUEUE_CB_S;
/* queue state */
/**
* @ingroup los_queue
* Message queue state: not in use.
*/
#define OS_QUEUE_UNUSED 0
/**
* @ingroup los_queue
* Message queue state: used.
*/
#define OS_QUEUE_INUSED 1
队列运作原理
创建队列
- 传入队列长度和消息节点大小
- 开辟相应的内存空间
- 返回队列ID。
队列中消息头节点 Head 和 消息尾节点 Tail
- Head 表示队列中被占用消息的起始位置
- Tail 表示队列中被空闲消息的起始位置
- 两者均采用回卷方式
usReadWriteableCnt[0]
判断是否可读取usReadWriteableCnt[1]
判断是否可写入删除队列时
- 根据传入的队列ID寻找到对应的队列
- 把队列状态置为未使用
- 释放原队列所占的空间
- 对应的队列控制头置为初始状态。
图解:
消息队列传输方式
LiteOS 的消息传输方式有两种
- 传地址方式
- 优点:效率高
- 缺点:修改源文件,消息对应的内容也会被修改
- 拷贝方式
- 优点:数据安全,是直接拷贝内容到消息中
- 缺点:效率相对传地址来说较低
- 传地址方式
用户可以根据需求选择不同的方式
- 主要参考 数据大小 及 数据重要性 来衡量
消息队列的阻塞机制
- 中断中不允许使用带有阻塞机制的 API,所以中断中,阻塞值均取 0
- LiteOS 已经实现了阻塞机制,用户直接使用即可
出队阻塞
- 三种方式:主要参考队列里面是否有消息
- 不等待:0
- 读取消息时,队列里面
- 有消息,正常读取
- 没有消息,则不等待,直接执行后面代码
- 读取消息时,队列里面
- 限时等待:
- 在规定时间内,消息队列里面
- 有消息,正常读取,
- 没有消息,则等待
- 超时
- 则直接执行后面代码
- 在规定时间内,消息队列里面
- 永久等待:LOS_WAIT_FOREVER
- 读取消息时
- 有消息,正常读取
- 没有消息,一直等待,直到队列里有消息
- 读取消息时
- 不等待:0
入队阻塞
- 三种方式:主要参考队列里面的消息是否满了
- 不等待:0
- 写入消息时
- 队列未满,正常写入
- 队列已满,则不等待,直接执行后面代码
- 写入消息时
- 限时等待:
- 写入消息时
- 队列未满,正常写入
- 队列已满,限时等待,等待队列未满后并写入
- 超时
- 则直接执行后面代码
- 写入消息时
- 永久等待:LOS_WAIT_FOREVER
- 写入消息时
- 队列未满,正常写入
- 队列已满,一直等待,直到队列未满
- 写入消息时
- 不等待:0
任务相关函数
接口名 | 描述 |
---|---|
LOS_QueueCreate | 创建一个消息 |
LOS_QueueRead | 读取指定队列中的数据。(buff里存放的是队列节点的地址) |
LOS_QueueWrite | 向指定队列写数据。(写入队列节点中的是buff的地址) |
LOS_QueueReadCopy | 读取指定队列中的数据。(buff里存放的是队列节点中的数据)(预留接口) |
LOS_QueueWriteCopy | 向指定队列写数据。(写入队列节点中的是buff中的数据)(预留接口) |
LOS_QueueWriteHead | 向指定队列的头部写数据 |
LOS_QueueDelete | 删除一个指定的队列 |
LOS_QueueInfoGet | 获取指定队列信息 |
各函数使用可以看源码或者例程
任务开发流程
- 非 copy 方式 ( copy 方式类同 )
- 创建消息队列LOS_QueueCreate。
- 创建成功后,可以得到消息队列的ID值。
- 写队列操作函数LOS_QueueWrite。
- 读队列操作函数LOS_QueueRead。
- 获取队列信息函数LOS_QueueInfoGet。
- 删除队列LOS_QueueDelete。
注意事项 *
- 系统可配置的队列资源个数
- 是指整个系统的队列资源总个数
- 而非用户能使用的个数。
- 例如:
- 系统软件定时器多占用一个队列资源
- 那么系统可配置的队列资源就会减少一个。
- 调用 LOS_QueueCreate 函数时所传入的队列名暂时未使用,作为以后的预留参数。
- 队列接口函数中的入参数 uwTimeOut 是指相对时间。
- LOS_QueueReadCopy 和 LOS_QueueWriteCopy 是一组接口
- LOS_QueueRead 和 LOS_QueueWrite 是一组接口,两组接口需要配套使用。
- 鉴于 LOS_QueueWrite 和 LOS_QueueRead 这组接口实际操作的是数据地址,用户必须保证调用 LOS_QueueRead 获取到的指针所指向内存区域在读队列期间没有被异常修改或释放,否则可能会导致不可预知的后果。
- 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
- 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
- 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
实战
【LiteOS】LiteOS消息队列的更多相关文章
- 【LiteOS】LiteOS消息队列-实战
目录 前言 链接 参考 笔录草稿 创建测试任务 部分源码 前言 链接 LiteOS源码链接 常见问题 华为开发者社区 华为LiteOS官方教程 我的gitee-LiteOS-mcu 参考 上面链接 笔 ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
随机推荐
- LVS : Linux Virtual Server 负载均衡,集群,高并发,robust
1 LVS : Linux Virtual Server http://www.linuxvirtualserver.org/ http://www.linuxvirtualserver.org/zh ...
- css scroll text without wrap & webkit-scrollbar
css scroll text without wrap hidden webkit-scrollbar .tabs-title-box::-webkit-scrollbar, .tabs-conte ...
- 你所不知道的 JS: null , undefined, NaN, true==1=="1",false==0=="",null== undefined
1 1 1 === 全相等(全部相等) == 值相等(部分相等) demo: var x=0; undefined var y=false; undefined if(x===y){ console ...
- how to find jobs in the website codes
how to find jobs in the website codes X-Custom-Heade https://developer.mozilla.org/en-US/docs/Web/AP ...
- 1月加密货币交易所访问量破3亿!NGK生态星空计划、NGK生态所带来双重利好!
据最新数据显示,2021年一月份,加密货币交易所网站的访问量急剧上升.约有3.44亿访问者涌入了加密货币交易所,超过2020年12月的1.96亿访问者总数,创2018年1月以来新高. 加密货币交易所网 ...
- Mosquitto
mosquitto可连接远程服务器及本地服务器. mosquitto可在一个节点内建立一个连接用于收发,也可在一个节点内建立多个连接用于收发.建立一个连接用于收发时,会有初始部分帧的延迟.(可能由于内 ...
- 关于Python 编码的一点认识
在计算机中,所有数据的存储.运算以及传输都必须是二进制数字,因为计算机只认识0和1. 当一个人把一份数据传给另一个人时,计算机传递的是其实是二进制数字,但这些数字需要被还原为原始信息. 这个工作当然是 ...
- Byte Buddy学习笔记
本文转载自Byte Buddy学习笔记 简介 Byte Buddy是一个JVM的运行时代码生成器,你可以利用它创建任何类,且不像JDK动态代理那样强制实现一个接口.Byte Buddy还提供了简单的A ...
- oracle之用户
命令都是在命令行窗口执行 创建用户 1)登陆管理员用户 sqlplus system/密码 sqlplus system/briup 注意不要以分号结尾 2)创建用户 create user 用户名 ...
- the import java.util cannot be resolve
重新配置一下build path 的jre,如果不行的话就重新设置jre(在add library中installed JREs)