首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VxWorks特点及基本概念详解(8)

VxWorks特点及基本概念详解(8)

2.3.5 VxWork消息队列(Message Queues)及管道介绍

消息队列(Message Queues)

现实的实时应用由一系列互相独立又协同工作的任务组成。信号量为任务间同步和联锁提供了高效机制。在VxWorks中,用于但一CPU任务之间通信主要(Primary)的机制是消息队列。

Full Duplex Communication Using Message Queues



消息队列允许一定数量不同长度的消息进行排列。任何任务或中断服务程序(ISR)能够发送消息给消息队列。任何任务可以从消息队列接受消息。多任务可以从同意消息队列发送和接受消息。两个任务之间的全双工(Full-Duplex)通信需要针对不同方向的两个消息队列。

消息队列函数介绍

MsgQCreate( ) 创建斌初始化一个消息队列

MsgQDelete( ) 终止并释放一个消息队列

MsgQSend( ) 发送一个消息到消息队列

MsgQReceive( ) 从消息队列接受一个消息

消息队列是由函数MsgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY)创建。它的参数MAX_MSGS指定了消息队列中可允许最多可以排列的消息数和每个消息允许的最大的字节数MAX_MSG_LEN。

一个任务或中断服务程序(ISR)用函数MsgQSend( )发送一个消息到消息队列。如果没有任务等待消息队列的消息,这个消息被添加消息缓存的队列里。如果某些任务已经在等待消息队列中的消息,消息立刻被传递给第一个等待的消息的任务。

一个任务用函数MsgQReceive( )从消息队列得到一个消息。如果消息队列缓存中有消息存在,第一个消息立刻出列并回到调用处(Caller).如果没有消息存在,则任务(Calling Task)停止(Blocks)并被添加到等待消息的任务队列中。这个等待的任务队列按照优先级或先进先出(FIFO)规则排列,这个规则有消息队列创建时所指定。

等待时间限制(Time Out)

MsgQSend( ) 和 MsgQReceive( )都有时间限制参数。当发送一个消息,如果消息队列缓存这时没有空间,这个参数指定允许等待的时间(Ticks数),直到队列缓存有空间来接收消息。当接收消息时,如果消息队列没有消息,这个参数指定允许等待的时间(Ticks数),直到消息队列有消息。



/* In This Example, Task T1 Creates The Message Queue And Sends A Message

* To Task T2. Task T2 Receives The Message From The Queue And Simply

* Displays The Message.

*/



/* Includes */

#Include "VxWorks.H"

#Include "MsgQLib.H"



/* Defines */

#Define MAX_MSGS (10)

#Define MAX_MSG_LEN (100)



MSG_Q_ID MyMsgQId;



Task2 (Void)

{

Char MsgBuf[MAX_MSG_LEN];



/* Get Message From Queue; If Necessary Wait Until Msg Is Available */

If (MsgQReceive(MyMsgQId, MsgBuf, MAX_MSG_LEN, WAIT_FOREVER) == ERROR)

Return (ERROR);



/* Display Message */

Printf ("Message From Task 1: %S ", MsgBuf);

}



#Define MESSAGE "Greetings From Task 1"

Task1 (Void)

{

/* Create Message Queue */

If ((MyMsgQId = MsgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY))

== NULL)

Return (ERROR);



/* Send A Normal Priority Message, Blocking If Queue Is Full */

If (MsgQSend (MyMsgQId, MESSAGE, Sizeof (MESSAGE), WAIT_FOREVER,

      MSG_PRI_NORMAL) == ERROR)

Return (ERROR);

}
返回列表