前言

链接

参考

  • 野火
  • 上面链接

笔录草稿

  • 最近工作有点忙,远吗阅读推迟了哈哈

基本概念

  • 队列又称消息队列

    • 是一种常用于任务间通信的数据结构
    • 能接收来自任务或中断的不固定长度的消息
    • 根据不同的 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 的消息传输方式有两种

    1. 传地址方式

      1. 优点:效率高
      2. 缺点:修改源文件,消息对应的内容也会被修改
    2. 拷贝方式
      1. 优点:数据安全,是直接拷贝内容到消息中
      2. 缺点:效率相对传地址来说较低
  • 用户可以根据需求选择不同的方式

    • 主要参考 数据大小 及 数据重要性 来衡量

消息队列的阻塞机制

  • 中断中不允许使用带有阻塞机制的 API,所以中断中,阻塞值均取 0
  • LiteOS 已经实现了阻塞机制,用户直接使用即可

出队阻塞

  • 三种方式:主要参考队列里面是否有消息

    • 不等待:0

      • 读取消息时,队列里面

        • 有消息,正常读取
        • 没有消息,则不等待,直接执行后面代码
    • 限时等待:
      • 在规定时间内,消息队列里面

        • 有消息,正常读取,
        • 没有消息,则等待
      • 超时
        • 则直接执行后面代码
    • 永久等待:LOS_WAIT_FOREVER
      • 读取消息时

        • 有消息,正常读取
        • 没有消息,一直等待,直到队列里有消息

入队阻塞

  • 三种方式:主要参考队列里面的消息是否满了

    • 不等待:0

      • 写入消息时

        • 队列未满,正常写入
        • 队列已满,则不等待,直接执行后面代码
    • 限时等待:
      • 写入消息时

        • 队列未满,正常写入
        • 队列已满,限时等待,等待队列未满后并写入
      • 超时
        • 则直接执行后面代码
    • 永久等待:LOS_WAIT_FOREVER
      • 写入消息时

        • 队列未满,正常写入
        • 队列已满,一直等待,直到队列未满

任务相关函数

接口名 描述
LOS_QueueCreate 创建一个消息
LOS_QueueRead 读取指定队列中的数据。(buff里存放的是队列节点的地址)
LOS_QueueWrite 向指定队列写数据。(写入队列节点中的是buff的地址)
LOS_QueueReadCopy 读取指定队列中的数据。(buff里存放的是队列节点中的数据)(预留接口)
LOS_QueueWriteCopy 向指定队列写数据。(写入队列节点中的是buff中的数据)(预留接口)
LOS_QueueWriteHead 向指定队列的头部写数据
LOS_QueueDelete 删除一个指定的队列
LOS_QueueInfoGet 获取指定队列信息

各函数使用可以看源码或者例程

任务开发流程

  • 非 copy 方式 ( copy 方式类同 )

    1. 创建消息队列LOS_QueueCreate。
    2. 创建成功后,可以得到消息队列的ID值。
    3. 写队列操作函数LOS_QueueWrite。
    4. 读队列操作函数LOS_QueueRead。
    5. 获取队列信息函数LOS_QueueInfoGet。
    6. 删除队列LOS_QueueDelete。

注意事项 *

  1. 系统可配置的队列资源个数

    • 是指整个系统的队列资源总个数
    • 而非用户能使用的个数。
    • 例如:
      • 系统软件定时器多占用一个队列资源
      • 那么系统可配置的队列资源就会减少一个。
  2. 调用 LOS_QueueCreate 函数时所传入的队列名暂时未使用,作为以后的预留参数。
  3. 队列接口函数中的入参数 uwTimeOut 是指相对时间。
  4. LOS_QueueReadCopy 和 LOS_QueueWriteCopy 是一组接口
  5. LOS_QueueRead 和 LOS_QueueWrite 是一组接口,两组接口需要配套使用。
  6. 鉴于 LOS_QueueWrite 和 LOS_QueueRead 这组接口实际操作的是数据地址,用户必须保证调用 LOS_QueueRead 获取到的指针所指向内存区域在读队列期间没有被异常修改或释放,否则可能会导致不可预知的后果。
  • 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
  • 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
  • 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量

实战

实战地址

【LiteOS】LiteOS消息队列的更多相关文章

  1. 【LiteOS】LiteOS消息队列-实战

    目录 前言 链接 参考 笔录草稿 创建测试任务 部分源码 前言 链接 LiteOS源码链接 常见问题 华为开发者社区 华为LiteOS官方教程 我的gitee-LiteOS-mcu 参考 上面链接 笔 ...

  2. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  3. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  4. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  5. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  6. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  7. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  8. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  9. Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇

    目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...

随机推荐

  1. vue 的 computed 属性在什么时间执行

    vue 的 computed 属性在什么时间执行

  2. 如何将多个 Apple 设备中保存在 iCloud 里面密码同步

    如何将多个 Apple 设备中保存在 iCloud 里面密码同步 iCloud 钥匙串 密码同步 数据迁移 iOS iCloud 钥匙串会记住一些信息,因此您就无需记忆这些信息. 它会在您批准的任何设 ...

  3. 如何通过 terminal 查看一个文件的 meta信息

    如何通过 terminal 查看一个文件的 meta 信息 Linux shell stat 查看文件 meta 信息 stat stat指令:文件/文件系统的详细信息显示: 使用格式:stat 文件 ...

  4. 封装 React Native 原生组件(iOS / Android)

    封装 React Native 原生组件(iOS / Android) 在 React Native中,有很多种丰富的组件了,例如 ScrollView.FlatList.SectionList.Bu ...

  5. 新年狂欢高倍币,1万枚VAST拿到手软

    新一年NGK推出了新币VAST,成为了当前最瞩目的一颗星.有人认为VAST有价无市,有人认为VAST价值巨大,潜力无限.总之,众说风云! 选择数字货币,当然是挑选有价值的货币,从内外价值入手. 一.币 ...

  6. InnoDB 的记录结构和页结构

    本文转载自InnoDB 的记录结构和页结构 概述 InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,中页的大小一般为16KB.也就是在一般情况下,一次最少从磁盘中读取16KB的内 ...

  7. net里面using的使用

    起初using就明白一个作用  那就是引用命名空间.当面试官听到我回答这个问题的时候,马上就还问我,还有什么作用?我就只能摇头了,今天在网上看了下using的作用. 1.using指令.using + ...

  8. vue学习遇到的问题

    1.vue脚手架的安装,解决链接:https://www.cnblogs.com/qcq0703/p/14439467.html2.2.2.0+ 的版本里,当在组件上使用 v-for 时,key 现在 ...

  9. 微信小程序登录流程解析

    小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识openid,快速建立小程序内的用户体系. 登录流程时序: 1.首先,调用 wx.login获取code ,判断用户是否授权读取用户 ...

  10. yum install valgrind.x86_64

    Reference: https://cloudlinux.zendesk.com/hc/en-us/articles/115004075294-Fix-rpmdb-Thread-died-in-Be ...