请选择 进入手机版 | 继续访问电脑版
快捷导航
本帖最后由 袁绪蝶 于 2017-12-22 15:06 编辑

三、消息队列
1 消息队列定义

消息队列是μC/OS-II中另一种通讯机制;
发送消息:它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。

(?问题?消息队列和邮箱有什么不同吗,都是发送指针变量)
发送多个消息采用队列管理。
常数OS_MAX_QS来决定μC/OS-II支持的最多消息队列数。

2 消息队列的使用

任务、ISR和消息队列的关系

消息队列的符号很像多个邮箱。实际上,我们可以将消息队列看作时多个邮箱组成的数组,只是它们共用一个等待任务列表。
每个指针所指向的数据结构是由具体的应用程序决定的。
N代表了消息队列中的总单元数。
当调用OSQPend()或者OSQAccept()之前,调用N次OSQPost()或者OSQPostFront()就会把消息队列填满。
中断程序不可以调用OSQPend()和OSQQuery()函数。

3 用于消息队列的数据结构

消息队列需要的数据结构:
——事件控制块来记录等待任务列表;
——一个队列控制块(OS_Q结构)来控制消息指针数组,队列控制块地址保存在OS_EVENT中的.OSEventPtr域;
——一个含有与消息队列最大消息数相同个数的指针数组,数组的起始地址以及数组中的元素数作为参数传递给OSQCreate()函数。

4 消息队列的循环缓冲区原理

消息队列最根本的部分是一个循环缓冲区
**************************************************************************
四、消息队列的通用操作
1 建立一个消息队列

OSQCreate()
2个参数:指向消息数组的指针和数组的大小。
——void * MyArrayOfMsg[SIZE];
——将MyArrayOfMsg[]的地址及数组的大小传递给OSQCreate()。

2 等待消息队列中的消息

OSQPend()
如果消息队列是空的,则调用本函数的任务被挂起,直到有别的任务(或者中断服务子程序)通过消息发送一则消息。
允许定义一个超时时限(定义为整型值)作为一个参数(timeout)。避免无限期地等待消息队列中的消息。

如果这个超时时限非0, OSQPend()就挂起这个任务,直到队列接收到一则消息或者等待超时。
注意:定义超时时限值为0,表示任务将无限期地等待小的的到来。

3 向消息队列发送一则消息

FIFO(先入先出)----OSQPost()
注意:如果 OSQPost()函数是由中断服务子程序调用的,那么即使产生了更高优先级的任务,也不会在调用 OSSched()函数时发生任务切换。这个动作一直要等到中断嵌套的最外层中断服务子程序调用 OSIntExit()函数时才能进行。

LIFO(后入先出)----OSQPostFront()

OSQPostFront()函数同OSQPost()基本上是一样的,只有在插入新的消息到消息队列中时,使用.OSQOut,而不是.OSQIn,作为指向下一个插入消息的单元指针。

FIFO或LIFO----OSQPostOpt()

以可替代的,更灵活的方式给消息队列发送消息。
新函数。可以完全替代OSQPostFront()和OSQPost()。
允许发送消息给所有消息队列中等待消息的任务(广播方式)。
注意:如果 OSQPostOpt ()函数是由中断服务子程序调用的,那么不会在调用 OSSched()函数时发生任务切换。这个动作一直要等到中断嵌套的最外层中断服务子程序调用 OSIntExit()函数时才能进行

4 无等待地从消息队列中获得消息

OSQAccept()
如果试图从消息队列中取出一条消息,而此时消息队列又为空时,也可以不让调用任务等待而直接返回调用函数。
调用OSQAccept()函数的代码应检查OSQAccept()函数的返回值。如果返回的是空指针NULL,则说明消息队列时空的,没有消息。空指针对应用程序没有用,因为按照约定,空指针是无效指针。非空指针说明,已经从消息队列中成功地获得了一则消息。中断服务子程序可以调用OSQAccept()。

5 清空消息队列

OSQFlush()
OSQFlush()函数允许清空一个消息队列中的所有消息,以重新开始使用。

6 获取消息队列的状态

OSQQuery()
OSQQuery()函数使用户可以查询一个消息队列的当前状态。
两个参数:一个是指向消息队列的指针 pevent。它是在建立一个消息队列时,由 OSQCreate()函数返回的;另一个是指向 OS_Q_DATA数据结构的指针pdata。该结构包含了有关消息队列的信息。在调用OSQQuery()函数之前,必须先定义该数据结构变量。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-22 15:06

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 19:31