嵌入式实时操作系统uC/os-II(十四)-消息队列

2023-05-16

  • 消息队列

消息队列由三部分组成:事件控制块、消息队列、消息。当事件控制块成员OSEventType值为OS_OSEVENT_TYPE_Q时,该事件控制块代表一个消息队列。

         消息队列的数据结构如图6-1所示。从图中可以看到,消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向一个叫做队列控制块(OS_Q)的结构,该结构管理着一个数组MsgTbl[],该数组中的元素都是指向消息的指针。

 

                                         图6-1 消息队列的数据结构

  1. 消息指针数组

消息队列的核心部件为消息数组指针。图6-2表示消息指针数组的结构,其中各参数的含义见表6-1

                         

                         

                                                               6-2 消息指针数组的结构

其中,OSQInOSQOut为可移动的指针;OSQStartOSQEnd为常指针。当可移动指针OSQInOSQOut移动到数组末尾,也就是与OSQEnd相等时,可移动的指针将会被调整到数组的起始位置OSQStart。也就是说,从效果上看,指针OSQEndOSQStart等值。于是,这个由消息指针构成的数组就头尾衔接起来形成一个如图6-3所示的循环队列。

                                    

                                                                      6-3 循环队列

     可用2种方式向指针数组插入消息:先进先出的FIFO方式和后进先出的LIFO方式。当采用先进先出(FIFO)方式时,消息队列将在指针OSQIn指向的位置插入消息指针,而OSQOut指向的消息指针为输出;当采用后进先出(LIFO)方式时,则只使用指针OSQOut,当向队列插入消息指针时,指针OSQOut将先移动到图6-3所示的位置(虚线所示),在按指针OSQOut指向的位置插入消息指针,输出时则指针OSQOut不需要移动,其指向就是输出。

  1. 队列控制块

为了对图6-2所示的消息指针数组进行有效的管理,uC/OS-II把消息指针数组的基本参数都记录在一个叫做队列控制块的结构中。队列控制块的结构如下:

typedef   struct os_q{

         struct  os_q  *OSQPtr;

         void          **OSQStart;

         void           **OSQEnd;

         void           **OSQIn;

         void           **OSQOut;

         INT16U    OSQSize;

         INT16U    OSQEntries;

}OS_Q;

uC/OS-II初始化时,系统将按文件OS_CFG.H中的配置常数OS_MAX_QS定义OS_MAX_QS个队列控制块,并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。由于这时还没有使用它们,因此这个链表叫做空队列控制块链表。空队列控制块链表如图6-4所示。

                               

                                                                             图6-4 空队列控制块链表

每当任务创建一个消息队列时,就会在空队列控制块链表中摘取一个控制块消息队列来使用,并令该消息队列事件控制块中的指针OSEventPtr指向这个队列的控制块;而当任务释放一个消息队列时,就会将该消息队列使用的队列控制块归还空队列控制块链表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式实时操作系统uC/os-II(十四)-消息队列 的相关文章

  • Docker 同一主机容器间通信

    Docker 容器间通信 本文我们采用bridge网络通信 1 创建bridge网络 docker network create testnet 2 查看Docker网络 docker network ls 3 运行容器连接到testnet
  • Centos7端口查看开放,防火墙开启关闭命令等

    1 开放 关闭端口 开放5001端口 firewall cmd zone 61 public add port 61 5001 tcp permanent 关闭5001端口 firewall cmd zone 61 public remov
  • .Net Core微服务入门——Ocelot API网关接入(一)

    Net Core微服务入门 Ocelot API网关接入 上一章我们测试了一个简单的Client 端访问Consul实现服务注册与发现 xff0c 但是现实生产环境我们直接通过Client自行连接Consul实现服务注册与发现 xff0c
  • .Net Core微服务入门——Ocelot API网关接入(二)

    Net Core微服务入门 Ocelot API网关接入 xff08 二 xff09 我们先接入Consul xff0c 实现服务发现 服务发现 1 引入 Ocelot Provider Consul 包 2 修改ocelot json x
  • .NET Core根据环境变量支持多个 appsettings.json配置文件

    NET Core根据环境变量支持多个 appsettings json配置文件 在项目开发的过程当中 xff0c 开发环境 测试环境 生产环境的配置肯定是不一样的 xff0c 单靠一个 appsettings json xff0c 没法满足
  • (转)SQL Server 2008 允许远程连接的解决方法

    用户在使用SQL Server 2008远程链接时 xff0c 可能会弹出如下对话框 xff1a 在链接SQL服务器时发生网络链接错误或特定实例错误 SQL服务器不存在或者链接不成功 请验证用户名是否正确或SQL服务器是否已经配置远程链接功
  • .Net Core微服务入门——Ocelot和Consul集群高可用

    Net Core微服务入门 Ocelot和Consul集群高可用 上一章 我们ocelot网关顺利的接入了consul集群 并且访问成功 但是 我们也遇到了问题 把 192 168 8 25 上的consul停掉了 重新访问ocelot网关
  • .Net Core微服务入门——Swagger接入

    Net Core微服务入门 Swagger接入 一 API接入Swagger 1 引入包 xff1a Swashbuckle AspNetCore 2 修改Startup xff0c 在ConfigureServices 中添加 Swagg
  • Docker 镜像迁移

    Docker 镜像迁移 由于生产环境外部无法访问 xff0c 需要将本地仓镜像包迁移到生成环境服务器上 1 将私有仓镜像导出 docker save span class token operator span o ocelot span
  • Docker 自动更新镜像和容器-Watchtower

    Docker 自动更新镜像和容器 Watchtower 我们Consul集群已经搭建好了 xff0c Docker api 服务也部署好了 xff0c 但是呢 xff0c 又碰到一个问题 我们每次更新api 服务 xff0c 都需要拉取镜像
  • .Net Core微服务入门——NLog接入

    Net Core微服务入门 NLog接入 Nlog接入 1 引入NLog Web AspNetCore 包 2 添加NLog 配置文件 nlog config 目录自定义 内容 xff1a lt xml version 61 34 1 0
  • .Net Core微服务入门——ELK日志中心

    Net Core微服务入门 ELK日志中心 Elasticsearch 是个开源分布式搜索引擎 xff0c 它的特点有 xff1a 分布式 xff0c 零配置 xff0c 自动发现 xff0c 索引自动分片 xff0c 索引副本机制 xff
  • MySQL Slave备份异常处理

    昨天Mysql备份突然出现问题 xff0c 从库一直没读到数据 1 执行 show slave status 发现一直处于Reading event from the relay log xff0c Seconds Behind Maste
  • Vue Loading PostCSS Plugin failed: Cannot find module ‘autoprefixer‘ 问题

    Vue Loading PostCSS Plugin failed Cannot find module autoprefixer 问题 vue运行时 xff0c 提示Vue Loading PostCSS Plugin failed Ca
  • 树莓派监测CPU温度

    通过raspberrypi os下的 sys class thermal thermal zone0 temp 文件获取CPU温度 xff0c 并用bc命令转换为更直观的浮点数温度显示 xff0c 并通过watch命令实时监控 执行watc
  • pyqt5自定义QWidget设置setStyleSheet不成功解决方法

    发现继承自QWidget的自定义类 xff0c 使用setStyleSheet无效 xff0c 解决办法 xff1a 第一种 xff1a 将继承QWidget改为QFrame xff0c 就可以了 第二种 xff1a 继承QWidget的自
  • debian软件源source.list文件格式说明

    在安装完debian操作系统之后大家做的第一件事大概就是修改source list文件了吧 xff0c 否则你是无法在线更新软件的 xff0c 那么source list文件中的各个配置项的具体含义你搞懂了么 xff1f 下面就以我的sou
  • 主机和虚拟机能ping通,但是连不上?已解决。

    有时候突然遇到这样的问题 xff0c 主机和虚拟机都能ping通 xff0c 但是就是连不上CRT或者Xshell 解决如下 xff1a 第一步 xff1a 打开 网络 xff1a 第二步 xff1a 打开网络共享中心 第三步 第四步 xf
  • 操作系统 - Lightdm

    了解Display Manager 1 Definition In the X Window System an X display manager is a graphical login manager which starts a s
  • 5G MEC 的本质是“联接+计算”

    本文针对边缘计算 xff08 multi access edge computing xff0c MEC xff09 的多种概念 xff0c 指出移动运营商立足的5G MEC 技术本质是 联接 43 计算 针对具体场景和关键诉求 xff0c

随机推荐