练习

本文介绍OSQQuery()函数,用于查询消息队列状态。该函数需提供消息队列指针及OS_Q_DATA结构指针作为参数,后者需预先定义。文章详细解析了函数的工作流程,包括检查事件类型、复制等待任务列表、获取队列中的消息内容等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. OSQQuery()函数使用户可以查询一个消息队列的当前状态。程序清单 L6.27是该函数的源代码。OSQQuery()需要两个参数:一个是指向消息队列的指针pevent。它是在建立一个消息队列时,由OSQCreate()函数返回的;另一个是指向OS_Q_DATA(见uCOS_II.H)数据结构的指针pdata。该结构包含了有关消息队列的信息。在调用OSQQuery()函数之前,必须先定义该数据结构变量。OS_Q_DATA结构包含下面的几个域:  
  2. .OSMsg 如果消息队列中有消息,它包含指针.OSQOut所指向的队列单元中的内容。如果队列是空的,.OSMsg包含一个NULL指针。  
  3. .OSNMsgs是消息队列中的消息数(.OSQEntries的拷贝)。  
  4. .OSQSize是消息队列的总的容量  
  5. .OSEventTbl[]和.OSEventGrp是消息队列的等待任务列表。通过它们, OSQQuery()的调用函数可以得到等待该消息队列中的消息的任务总数。  
  6. OSQQuery()函数首先检查pevent指针指向的事件控制块是一个消息队列[L6.27(1)],然后复制等待任务列表[L6.27(2)]。如果消息队列中有消息[L6.27(3)],.OSQOut指向的队列单元中的内容被复制到OS_Q_DATA结构中[L6.27(4)],否则的话,就复制一个NULL指针[L6.27(5)]。最后,复制消息队列中的消息数和消息队列的容量大小[L6.27(6)]。  
  7.   
  8. 程序清单 L6.27 程序消息队列的状态  
  9. INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)  
  10. {  
  11.     OS_Q   *pq;  
  12.     INT8U   i;  
  13.     INT8U  *psrc;  
  14.     INT8U  *pdest;  
  15.   
  16.   
  17.     OS_ENTER_CRITICAL();  
  18.     if (pevent->OSEventType != OS_EVENT_TYPE_Q) {                (1)  
  19.         OS_EXIT_CRITICAL();  
  20.         return (OS_ERR_EVENT_TYPE);  
  21.     }  
  22.     pdata->OSEventGrp = pevent->OSEventGrp;                     (2)  
  23.     psrc              = &pevent->OSEventTbl[0];  
  24.     pdest             = &pdata->OSEventTbl[0];  
  25.     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {        *pdest++ = *psrc++;  
  26.     }  
  27.     pq = (OS_Q *)pevent->OSEventPtr;  
  28.     if (pq->OSQEntries > 0) {                                 (3)  
  29.         pdata->OSMsg = pq->OSQOut;                               (4)  
  30.     } else {  
  31.         pdata->OSMsg = (void *)0;                                (5)  
  32.     }  
  33.     pdata->OSNMsgs = pq->OSQEntries;                           (6)  
  34.     pdata->OSQSize = pq->OSQSize;  
  35.     OS_EXIT_CRITICAL();  
  36.     return (OS_NO_ERR);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值