μC/OS-II 任务的同步与通信 --- 消息队列
简介
使用消息队列可以在任务之间传递多条消息。消息队列由三个部分组成:事件控制块、消息队列和消息。
当把事件控制块成员 OSEventType 的值置为 OS_EVENT_TYPE_Q 时,该事件控制块描述的就是一个消息队列。
消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员 OSEventPtr 指向了一个叫做队列控制块(OS_Q)的结构,该结构管理了一个数组 MsgTbl[ ],该数组中的元素都是一些指向消息的指针。
消息队列的数据结构

其中,可以移动的指针为 OSQIn 和 OSQOut,而指针 OSQStart 和 OSQEnd 只是一个标志(常指针)。当可移动的指针 OSQIn 或 OSQOut 移动到数组末尾,也就是与 OSQEnd 相等时,可移动的指针将会被调整到数组的起始位置 OSQStart。也就是说,从效果上来看,指针 OSQEnd 与 OSQStart 等值。于是,这个由消息指针构成的数组就头尾衔接起来形成了一个如下图所示的循环的队列。

为了对图所示的消息指针数组进行有效的管理,μC/OS-II 把消息指针数组的基本参数都记录在一个叫做队列控制块的结构中,队列控制块的结构如下:
typedef struct os_q
{
struct os_q *OSQPtr;
void **OSQStart;
void **OSQEnd;
void **OSQIn;
void **OSQOut;
INT16U OSQSize;
INT16U OSQEntries;
} OS_Q;
消息队列的创建
创建一个消息队列首先需要定义一指针数组,然后把各个消息数据缓冲区的首地址存入这个数组中,然后再调用函数 OSQCreate( ) 来创建消息队列。创建消息队列函数 OSQCreate( ) 的原型为:
OS_EVENT OSQCreate(
void **start, //指针数组的地址
INT16U size //数组长度
);
请求消息队列
请求消息队列的目的是为了从消息队列中获取消息。任务请求消息队列需要调用函数 OSQPend( ),该函数的原型为:
void *OSQPend(
OS_EVENT *pevent, //所请求的消息队列的指针
INT16U timeout, //等待时限
INT8U *err //错误信息
);
向消息队列发送消息
任务需要通过调用函数 OSQPost( ) 或 OSQPostFront( ) 来向消息队列发送消息。函数 OSQPost( ) 以 FIFO(先进先出)的方式组织消息队列,函数 OSQPostFront( ) 以 LIFO(后进先出)的方式组织消息队列。这两个函数的原型分别为:
INT8U OSQPost(
OS_EVENT *pevent, //消息队列的指针
void *msg //消息指针
);
INT8U OSQPostFront(
OS_EVENT *pevent, //消息队列的指针
void *msg //消息指针
);
函数中的参数 msg 为待发消息的指针。
参考自:《μC/OS-II 入门教程》
μC/OS-II 任务的同步与通信 --- 消息队列的更多相关文章
- μC/OS-II 任务的同步与通信 --- 消息邮箱
简介 如果把数据缓冲区的指针赋给一个事件控制块的成员 OSEventPrt,同时使事件控制块的成员 OSEventType 为常数 OS_EVENT_TYPE_MBOX,则该事件控制块就叫做消息邮箱, ...
- [PHP] 多进程通信-消息队列使用
向消息队列发送数据和获取数据的测试 <?php $key=ftok(__FILE__,'a'); //获取消息队列 $queue=msg_get_queue($key,0666); //发送消息 ...
- Python 多线程、多进程 (二)之 多线程、同步、通信
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- US/OS2之任务同步与通信
嵌入式系统中的各个任务都是以并发的方式来运行的,并为同一个大的任务服务,它们不可避免地要共同使用一些共享资源,并且在处理一些需要多个任务共同协作来完成的工作时,还需要相互的支持和限制.因此,对于一个完 ...
- C++同步串口通信
问题描述: C++串口通信,设置同步串口通信 问题解决: (1)打开串口 注: 使用串口需要添加<Windows.h>头文件,打开串口主要是使用CreateFile ...
- 【VxWorks系列】任务间同步与通信之共享内存
在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...
- Linux下多任务间通信和同步-消息队列
Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...
- linux同步与通信
这几天读完了UNP v2,对进程间通信与同步的方式有所了解,现对主要的知识点总结如下: 根据出现的历史,先有的管道,FIFO,信号,然后是systemV IPC,再是后来的Poxis IPC,syst ...
随机推荐
- asp.net动态加载程序集创建指定类的实例及调用指定方法
以下类中有三个方法: LoadAssembly:加载指定路径的程序集 GetInstance:根据Type动态获取实例,用泛型接到返回的类型 ExecuteMothod:执行实例中的指定方法 /// ...
- 使用@Autowird注入报空指针异常
new的对象不能调用此对象里面注入的其他类,如果想要调用注入的其他类,则此new的对象要使用@componet将此类注入. 原因:
- 三级菜单,可以退出到上一级菜单和全部退出(low版本)
menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youk ...
- 2019/3/4 java集合学习(二)
java集合学习(二) 在学完ArrayList 和 LinkedList之后,基本已经掌握了最基本的java常用数据结构,但是为了提高程序的效率,还有很多种特点各异的数据结构等着我们去运用,类如可以 ...
- C#-Database-连接
using System.Data; using System.Data.SqlClient; //先打开两个类库文件 SqlConnection con = new SqlConnection(); ...
- 网络编程——UDP编程
一个简单的聊天代码:运行结果: 在这个程序之中,由于recvfrom函数拥塞函数,没有数据时会一直阻塞,所以客户端和服务器端只能通过一回一答的方式进行信息传递.严格的讲UDP没有明确的客户端和服务端, ...
- mybatis 中的缓冲
package com.oaec.mybatis.test; import com.oaec.mybatis.dao.StudentDao;import com.oaec.mybatis.entity ...
- [转] KVM VirtIO paravirtualized drivers: why they matter
http://www.ilsistemista.net/index.php/virtualization/42-kvm-virtio-paravirtualized-drivers-why-they- ...
- [转] List of OpenFlow Software Projects
List of OpenFlow Software Projects (that I know of) http://yuba.stanford.edu/~casado/of-sw.html (I a ...
- Python selenium webdriver设置js操作页面滚动条
js2 = "window.scrollTo(0,0);" #括号中为坐标 当不知道需要的滚动的坐标大小时: weizhi2 = driver.find_element_by_id ...