ucos II 任务间 通信之五:消息队列2
2012-03-06 11:59
218 查看
ucos II 任务间 通信之五:消息队列2
分类: ucos II2011-12-1822: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)]。
相关文章推荐
- ucos II 任务间 通信之五:消息队列1
- ucos II 任务间 通信之五:消息队列2
- ucos II 任务间 通信之五:消息队列1
- vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等
- vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件
- vxworks下任务间消息队列通信例程
- vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等
- 【VxWorks系列】任务间同步与通信之消息队列
- UCOS-II任务间通信(信号量、邮箱、消息队列)
- vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等
- Linux——基于共享内存 消息队列和基于Socket的进程间的通信
- 消息队列实现通信
- 消息队列通信方式为什么在内核和用户空间进行四次的数据拷贝
- 几种MQ消息队列对比与消息队列之间的通信问题
- 几种MQ消息队列对比与消息队列之间的通信问题
- Linux进程通信之POSIX消息队列
- WinForm 和 Windows Service 通信 消息队列
- 进程通信之消息队列
- ucos II 任务间 通信之三:信号量1
- Linux消息队列进程通信的介绍