查询一个消息队列的状态,OSQQuery()

来源:互联网 发布:网站建设方案书 阿里云 编辑:程序博客网 时间:2024/05/18 22:45
  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);  

0 0