- 如果试图从消息队列中取出一条消息,而此时消息队列又为空时,也可以不让调用任务等待而直接返回调用函数。这个操作可以调用OSQAccept()函数来完成。程序清单 L6.25是该函数的源代码。OSQAccept()函数首先查看pevent指向的事件控制块是否是由OSQCreate()函数建立的[L6.25(1)],然后它检查当前消息队列中是否有消息[L6.25(2)]。如果消息队列中有至少一条消息,那么就从.OSQOut指向的单元中取出消息[L6.25(3)]。OSQAccept()函数的调用函数需要对OSQAccept()返回的指针进行检查。如果该指针是NULL值,说明消息队列是空的,其中没有消息可以 [L6.25(4)]。否则的话,说明已经从消息队列中成功地取得了一条消息。当中断服务子程序要从消息队列中取消息时,必须使用OSQAccept()函数,而不能使用OSQPend()函数。
- 程序清单 L6.25 无等待地从消息队列中取一条消息
- void *OSQAccept (OS_EVENT *pevent)
- {
- void *msg;
- OS_Q *pq;
- OS_ENTER_CRITICAL();
- if (pevent->OSEventType != OS_EVENT_TYPE_Q) { (1)
- OS_EXIT_CRITICAL();
- return ((void *)0);
- }
- pq = pevent->OSEventPtr;
- if (pq->OSQEntries != 0) { (2)
- msg = *pq->OSQOut++; (3)
- pq->OSQEntries--;
- if (pq->OSQOut == pq->OSQEnd) {
- pq->OSQOut = pq->OSQStart;
- } } else {
- msg = (void *)0; (4)
- }
- OS_EXIT_CRITICAL();
- return (msg);
- }
0416
最新推荐文章于 2023-09-21 23:19:20 发布