您的位置:首页 > 其它

ucos II 任务间 通信之五:消息队列2

2012-03-06 11:59 218 查看


ucos II 任务间 通信之五:消息队列2

分类: ucos II2011-12-18
22:04 38人阅读 评论(0) 收藏 举报

ucos II 任务间 通信之五:消息队列2

消息队列通常可以应用以下两个地方;

1.存储外部事件:外部事件由中断收集,然后存储到队列。

2.串口接收程序中的接收循环缓冲区,可理解为消息队列。

使用一个消息队列的步骤如下;

1、 建立一个指向消息数组的指针和数组的大小,该指针数组必须申明为void类型,如下:

void *MyArrayOfMsg[SIZE];

2、 声明一个OS_EVENT类型的指针指向生成的队列,如下:

OS_EVENT *QSem;

3、 调用OSQcreate()函数创建消息队列,如下:

QSem = OSQcreate(&MyArrayOfMsg[0],SIZE);

4、 等待消息队列中的消息,OSQPend()。

5、 向消息队列发送一则消息。

建立一个消息队列,OSQCreate()的实现代码如下:
OS_EVENT *OSQCreate (void **start, INT16U size)
{
OS_EVENT *pevent;
OS_Q *pq;
OS_ENTER_CRITICAL();
pevent = OSEventFreeList; (1)
if (OSEventFreeList != (OS_EVENT *)0) {
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; (2)
}
OS_EXIT_CRITICAL();
if (pevent != (OS_EVENT *)0) {
OS_ENTER_CRITICAL();
pq = OSQFreeList; (3)
if (OSQFreeList != (OS_Q *)0) {
OSQFreeList = OSQFreeList->OSQPtr;
}
OS_EXIT_CRITICAL();
if (pq != (OS_Q *)0) {
pq->OSQStart = start; (4)
pq->OSQEnd = &start[size];
pq->OSQIn = start;
pq->OSQOut = start;
pq->OSQSize = size;
pq->OSQEntries = 0;
pevent->OSEventType = OS_EVENT_TYPE_Q; (5)
pevent->OSEventPtr = pq; (6)
OSEventWaitListInit(pevent); (7)
} else {
OS_ENTER_CRITICAL();
pevent->OSEventPtr = (void *)OSEventFreeList; (8)
OSEventFreeList = pevent;
OS_EXIT_CRITICAL();
pevent = (OS_EVENT *)0;
}
}
return (pevent); (9)
}
它和创建邮箱,创建信号量过程是很相似的,首先申请控制块,接着初始化这个控制块,和创建邮箱,信号量不同的,创建消息队列过程是多申请了一个队列控制块。具体看下文解释。

OSQCreate()首先从空闲事件控制块链表中取得一个事件控制块 [ (1)],并对剩下的空闲事件控制块列表的指针做相应的调整,使它指向下一个空闲事件控制块[ (2)]。接着,OSQCreate()函数从空闲队列控制块列表中取出一个队列控制块[ (3)]。如果有空闲队列控制块是可以的,就对其进行初始化[ (4)]。然后该函数将事件控制块的类型设置为OS_EVENT_TYPE_Q [ (5)],并使其.OSEventPtr指针指向队列控制块[ (6)]。OSQCreate()还要调用OSEventWaitListInit()函数对事件控制块的等待任务列表初始化[
(7)]。因为此时消息队列正在初始化,显然它的等待任务列表是空的。最后,OSQCreate()向它的调用函数返回一个指向事件控制块的指针[ (9)]。该指针将在调用OSQPend(),OSQPost(),OSQPostFront(),OSQFlush(),OSQAccept()和OSQQuery()等消息队列处理函数时使用。因此,该指针可以被看作是对应消息队列的句柄。值得注意的是,如果此时没有空闲的事件控制块,OSQCreate()函数将返回一个NULL指针。如果没有队列控制块可以使用,为了不浪费事件控制块资源,OSQCreate()函数将把刚刚取得的事件控制块重新返还给空闲事件控制块列表
[(8)]。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: