os_mbox.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:25k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/OS-II
  4. *                                          The Real-Time Kernel
  5. *                                       MESSAGE MAILBOX MANAGEMENT
  6. *
  7. *                          (c) Copyright 1992-2006, Jean J. Labrosse, Weston, FL
  8. *                                           All Rights Reserved
  9. *
  10. * File    : OS_MBOX.C
  11. * By      : Jean J. Labrosse
  12. * Version : V2.83
  13. *********************************************************************************************************
  14. */
  15. #ifndef  OS_MASTER_FILE
  16. #include <ucos_ii.h>
  17. #endif
  18. #if OS_MBOX_EN > 0
  19. /*
  20. *********************************************************************************************************
  21. *                                     ACCEPT MESSAGE FROM MAILBOX
  22. *
  23. * Description: This function checks the mailbox to see if a message is available.  Unlike OSMboxPend(),
  24. *              OSMboxAccept() does not suspend the calling task if a message is not available.
  25. *
  26. * Arguments  : pevent        is a pointer to the event control block
  27. *
  28. * Returns    : != (void *)0  is the message in the mailbox if one is available.  The mailbox is cleared
  29. *                            so the next time OSMboxAccept() is called, the mailbox will be empty.
  30. *              == (void *)0  if the mailbox is empty or,
  31. *                            if 'pevent' is a NULL pointer or,
  32. *                            if you didn't pass the proper event pointer.
  33. *********************************************************************************************************
  34. */
  35. #if OS_MBOX_ACCEPT_EN > 0
  36. void  *OSMboxAccept (OS_EVENT *pevent)
  37. {
  38.     void      *msg;
  39. #if OS_CRITICAL_METHOD == 3                               /* Allocate storage for CPU status register  */
  40.     OS_CPU_SR  cpu_sr = 0;
  41. #endif
  42. #if OS_ARG_CHK_EN > 0
  43.     if (pevent == (OS_EVENT *)0) {                        /* Validate 'pevent'                         */
  44.         return ((void *)0);
  45.     }
  46. #endif
  47.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {      /* Validate event block type                 */
  48.         return ((void *)0);
  49.     }
  50.     OS_ENTER_CRITICAL();
  51.     msg                = pevent->OSEventPtr;
  52.     pevent->OSEventPtr = (void *)0;                       /* Clear the mailbox                         */
  53.     OS_EXIT_CRITICAL();
  54.     return (msg);                                         /* Return the message received (or NULL)     */
  55. }
  56. #endif
  57. /*$PAGE*/
  58. /*
  59. *********************************************************************************************************
  60. *                                        CREATE A MESSAGE MAILBOX
  61. *
  62. * Description: This function creates a message mailbox if free event control blocks are available.
  63. *
  64. * Arguments  : msg           is a pointer to a message that you wish to deposit in the mailbox.  If
  65. *                            you set this value to the NULL pointer (i.e. (void *)0) then the mailbox
  66. *                            will be considered empty.
  67. *
  68. * Returns    : != (OS_EVENT *)0  is a pointer to the event control clock (OS_EVENT) associated with the
  69. *                                created mailbox
  70. *              == (OS_EVENT *)0  if no event control blocks were available
  71. *********************************************************************************************************
  72. */
  73. OS_EVENT  *OSMboxCreate (void *msg)
  74. {
  75.     OS_EVENT  *pevent;
  76. #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
  77.     OS_CPU_SR  cpu_sr = 0;
  78. #endif
  79.     if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
  80.         return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
  81.     }
  82.     OS_ENTER_CRITICAL();
  83.     pevent = OSEventFreeList;                    /* Get next free event control block                  */
  84.     if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
  85.         OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
  86.     }
  87.     OS_EXIT_CRITICAL();
  88.     if (pevent != (OS_EVENT *)0) {
  89.         pevent->OSEventType    = OS_EVENT_TYPE_MBOX;
  90.         pevent->OSEventCnt     = 0;
  91.         pevent->OSEventPtr     = msg;            /* Deposit message in event control block             */
  92. #if OS_EVENT_NAME_SIZE > 1
  93.         pevent->OSEventName[0] = '?';
  94.         pevent->OSEventName[1] = OS_ASCII_NUL;
  95. #endif
  96.         OS_EventWaitListInit(pevent);
  97.     }
  98.     return (pevent);                             /* Return pointer to event control block              */
  99. }
  100. /*$PAGE*/
  101. /*
  102. *********************************************************************************************************
  103. *                                         DELETE A MAIBOX
  104. *
  105. * Description: This function deletes a mailbox and readies all tasks pending on the mailbox.
  106. *
  107. * Arguments  : pevent        is a pointer to the event control block associated with the desired
  108. *                            mailbox.
  109. *
  110. *              opt           determines delete options as follows:
  111. *                            opt == OS_DEL_NO_PEND   Delete the mailbox ONLY if no task pending
  112. *                            opt == OS_DEL_ALWAYS    Deletes the mailbox even if tasks are waiting.
  113. *                                                    In this case, all the tasks pending will be readied.
  114. *
  115. *              err           is a pointer to an error code that can contain one of the following values:
  116. *                            OS_NO_ERR               The call was successful and the mailbox was deleted
  117. *                            OS_ERR_DEL_ISR          If you attempted to delete the mailbox from an ISR
  118. *                            OS_ERR_INVALID_OPT      An invalid option was specified
  119. *                            OS_ERR_TASK_WAITING     One or more tasks were waiting on the mailbox
  120. *                            OS_ERR_EVENT_TYPE       If you didn't pass a pointer to a mailbox
  121. *                            OS_ERR_PEVENT_NULL      If 'pevent' is a NULL pointer.
  122. *
  123. * Returns    : pevent        upon error
  124. *              (OS_EVENT *)0 if the mailbox was successfully deleted.
  125. *
  126. * Note(s)    : 1) This function must be used with care.  Tasks that would normally expect the presence of
  127. *                 the mailbox MUST check the return code of OSMboxPend().
  128. *              2) OSMboxAccept() callers will not know that the intended mailbox has been deleted!
  129. *              3) This call can potentially disable interrupts for a long time.  The interrupt disable
  130. *                 time is directly proportional to the number of tasks waiting on the mailbox.
  131. *              4) Because ALL tasks pending on the mailbox will be readied, you MUST be careful in
  132. *                 applications where the mailbox is used for mutual exclusion because the resource(s)
  133. *                 will no longer be guarded by the mailbox.
  134. *********************************************************************************************************
  135. */
  136. #if OS_MBOX_DEL_EN > 0
  137. OS_EVENT  *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
  138. {
  139.     BOOLEAN    tasks_waiting;
  140.     OS_EVENT  *pevent_return;
  141. #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  142.     OS_CPU_SR  cpu_sr = 0;
  143. #endif
  144. #if OS_ARG_CHK_EN > 0
  145.     if (err == (INT8U *)0) {                               /* Validate 'err'                           */
  146.         return (pevent);
  147.     }
  148.     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
  149.         *err = OS_ERR_PEVENT_NULL;
  150.         return (pevent);
  151.     }
  152. #endif
  153.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
  154.         *err = OS_ERR_EVENT_TYPE;
  155.         return (pevent);
  156.     }
  157.     if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
  158.         *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
  159.         return (pevent);
  160.     }
  161.     OS_ENTER_CRITICAL();
  162.     if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on mailbox      */
  163.         tasks_waiting = OS_TRUE;                           /* Yes                                      */
  164.     } else {
  165.         tasks_waiting = OS_FALSE;                          /* No                                       */
  166.     }
  167.     switch (opt) {
  168.         case OS_DEL_NO_PEND:                               /* Delete mailbox only if no task waiting   */
  169.              if (tasks_waiting == OS_FALSE) {
  170. #if OS_EVENT_NAME_SIZE > 1
  171.                  pevent->OSEventName[0] = '?';             /* Unknown name                             */
  172.                  pevent->OSEventName[1] = OS_ASCII_NUL;
  173. #endif
  174.                  pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
  175.                  pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
  176.                  pevent->OSEventCnt  = 0;
  177.                  OSEventFreeList     = pevent;             /* Get next free event control block        */
  178.                  OS_EXIT_CRITICAL();
  179.                  *err                = OS_NO_ERR;
  180.                  pevent_return       = (OS_EVENT *)0;      /* Mailbox has been deleted                 */
  181.              } else {
  182.                  OS_EXIT_CRITICAL();
  183.                  *err                = OS_ERR_TASK_WAITING;
  184.                  pevent_return       = pevent;
  185.              }
  186.              break;
  187.         case OS_DEL_ALWAYS:                                /* Always delete the mailbox                */
  188.              while (pevent->OSEventGrp != 0) {             /* Ready ALL tasks waiting for mailbox      */
  189.                  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX);
  190.              }
  191. #if OS_EVENT_NAME_SIZE > 1
  192.              pevent->OSEventName[0] = '?';                 /* Unknown name                             */
  193.              pevent->OSEventName[1] = OS_ASCII_NUL;
  194. #endif
  195.              pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
  196.              pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
  197.              pevent->OSEventCnt     = 0;
  198.              OSEventFreeList        = pevent;              /* Get next free event control block        */
  199.              OS_EXIT_CRITICAL();
  200.              if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
  201.                  OS_Sched();                               /* Find highest priority task ready to run  */
  202.              }
  203.              *err          = OS_NO_ERR;
  204.              pevent_return = (OS_EVENT *)0;                /* Mailbox has been deleted                 */
  205.              break;
  206.         default:
  207.              OS_EXIT_CRITICAL();
  208.              *err          = OS_ERR_INVALID_OPT;
  209.              pevent_return = pevent;
  210.              break;
  211.     }
  212.     return (pevent_return);
  213. }
  214. #endif
  215. /*$PAGE*/
  216. /*
  217. *********************************************************************************************************
  218. *                                      PEND ON MAILBOX FOR A MESSAGE
  219. *
  220. * Description: This function waits for a message to be sent to a mailbox
  221. *
  222. * Arguments  : pevent        is a pointer to the event control block associated with the desired mailbox
  223. *
  224. *              timeout       is an optional timeout period (in clock ticks).  If non-zero, your task will
  225. *                            wait for a message to arrive at the mailbox up to the amount of time
  226. *                            specified by this argument.  If you specify 0, however, your task will wait
  227. *                            forever at the specified mailbox or, until a message arrives.
  228. *
  229. *              err           is a pointer to where an error message will be deposited.  Possible error
  230. *                            messages are:
  231. *
  232. *                            OS_NO_ERR           The call was successful and your task received a
  233. *                                                message.
  234. *                            OS_TIMEOUT          A message was not received within the specified timeout
  235. *                            OS_ERR_EVENT_TYPE   Invalid event type
  236. *                            OS_ERR_PEND_ISR     If you called this function from an ISR and the result
  237. *                                                would lead to a suspension.
  238. *                            OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer
  239. *
  240. * Returns    : != (void *)0  is a pointer to the message received
  241. *              == (void *)0  if no message was received or,
  242. *                            if 'pevent' is a NULL pointer or,
  243. *                            if you didn't pass the proper pointer to the event control block.
  244. *********************************************************************************************************
  245. */
  246. void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
  247. {
  248.     void      *msg;
  249. #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
  250.     OS_CPU_SR  cpu_sr = 0;
  251. #endif
  252. #if OS_ARG_CHK_EN > 0
  253.     if (err == (INT8U *)0) {                          /* Validate 'err'                                */
  254.         return ((void *)0);
  255.     }
  256.     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
  257.         *err = OS_ERR_PEVENT_NULL;
  258.         return ((void *)0);
  259.     }
  260. #endif
  261.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
  262.         *err = OS_ERR_EVENT_TYPE;
  263.         return ((void *)0);
  264.     }
  265.     if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
  266.         *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
  267.         return ((void *)0);
  268.     }
  269.     if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
  270.         *err = OS_ERR_PEND_LOCKED;                    /* ... can't PEND when locked                    */
  271.         return ((void *)0);
  272.     }
  273.     OS_ENTER_CRITICAL();
  274.     msg = pevent->OSEventPtr;
  275.     if (msg != (void *)0) {                           /* See if there is already a message             */
  276.         pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
  277.         OS_EXIT_CRITICAL();
  278.         *err = OS_NO_ERR;
  279.         return (msg);                                 /* Return the message received (or NULL)         */
  280.     }
  281.     OSTCBCur->OSTCBStat  |= OS_STAT_MBOX;             /* Message not available, task will pend         */
  282.     OSTCBCur->OSTCBPendTO = OS_FALSE;
  283.     OSTCBCur->OSTCBDly    = timeout;                  /* Load timeout in TCB                           */
  284.     OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
  285.     OS_EXIT_CRITICAL();
  286.     OS_Sched();                                       /* Find next highest priority task ready to run  */
  287.     OS_ENTER_CRITICAL();
  288.     if (OSTCBCur->OSTCBPendTO == OS_TRUE) {           /* See if we were given the message              */
  289.         OS_EventTO(pevent);                           /* Timed out, Make task ready                    */
  290.         OS_EXIT_CRITICAL();
  291.         *err = OS_TIMEOUT;                            /* Indicate that a timeout occured               */
  292.         return ((void *)0);                           /* Return a NULL message                         */
  293.     }
  294.     msg                     = OSTCBCur->OSTCBMsg;
  295.     OSTCBCur->OSTCBMsg      = (void *)0;              /* Yes, clear message received                   */
  296.     OSTCBCur->OSTCBStat     = OS_STAT_RDY;
  297.     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;          /* No longer waiting for event                   */
  298.     OS_EXIT_CRITICAL();
  299.     *err                    = OS_NO_ERR;
  300.     return (msg);                                     /* Return the message received                   */
  301. }
  302. /*$PAGE*/
  303. /*
  304. *********************************************************************************************************
  305. *                                       POST MESSAGE TO A MAILBOX
  306. *
  307. * Description: This function sends a message to a mailbox
  308. *
  309. * Arguments  : pevent        is a pointer to the event control block associated with the desired mailbox
  310. *
  311. *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
  312. *
  313. * Returns    : OS_NO_ERR            The call was successful and the message was sent
  314. *              OS_MBOX_FULL         If the mailbox already contains a message.  You can can only send one
  315. *                                   message at a time and thus, the message MUST be consumed before you
  316. *                                   are allowed to send another one.
  317. *              OS_ERR_EVENT_TYPE    If you are attempting to post to a non mailbox.
  318. *              OS_ERR_PEVENT_NULL   If 'pevent' is a NULL pointer
  319. *              OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
  320. *
  321. * Note(s)    : 1) HPT means Highest Priority Task
  322. *********************************************************************************************************
  323. */
  324. #if OS_MBOX_POST_EN > 0
  325. INT8U  OSMboxPost (OS_EVENT *pevent, void *msg)
  326. {
  327. #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
  328.     OS_CPU_SR  cpu_sr = 0;
  329. #endif
  330. #if OS_ARG_CHK_EN > 0
  331.     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
  332.         return (OS_ERR_PEVENT_NULL);
  333.     }
  334.     if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
  335.         return (OS_ERR_POST_NULL_PTR);
  336.     }
  337. #endif
  338.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
  339.         return (OS_ERR_EVENT_TYPE);
  340.     }
  341.     OS_ENTER_CRITICAL();
  342.     if (pevent->OSEventGrp != 0) {                        /* See if any task pending on mailbox        */
  343.         (void)OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready HPT waiting on event                */
  344.         OS_EXIT_CRITICAL();
  345.         OS_Sched();                                   /* Find highest priority task ready to run       */
  346.         return (OS_NO_ERR);
  347.     }
  348.     if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
  349.         OS_EXIT_CRITICAL();
  350.         return (OS_MBOX_FULL);
  351.     }
  352.     pevent->OSEventPtr = msg;                         /* Place message in mailbox                      */
  353.     OS_EXIT_CRITICAL();
  354.     return (OS_NO_ERR);
  355. }
  356. #endif
  357. /*$PAGE*/
  358. /*
  359. *********************************************************************************************************
  360. *                                       POST MESSAGE TO A MAILBOX
  361. *
  362. * Description: This function sends a message to a mailbox
  363. *
  364. * Arguments  : pevent        is a pointer to the event control block associated with the desired mailbox
  365. *
  366. *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
  367. *
  368. *              opt           determines the type of POST performed:
  369. *                            OS_POST_OPT_NONE         POST to a single waiting task
  370. *                                                     (Identical to OSMboxPost())
  371. *                            OS_POST_OPT_BROADCAST    POST to ALL tasks that are waiting on the mailbox
  372. *
  373. * Returns    : OS_NO_ERR            The call was successful and the message was sent
  374. *              OS_MBOX_FULL         If the mailbox already contains a message.  You can can only send one
  375. *                                   message at a time and thus, the message MUST be consumed before you
  376. *                                   are allowed to send another one.
  377. *              OS_ERR_EVENT_TYPE    If you are attempting to post to a non mailbox.
  378. *              OS_ERR_PEVENT_NULL   If 'pevent' is a NULL pointer
  379. *              OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
  380. *
  381. * Note(s)    : 1) HPT means Highest Priority Task
  382. *
  383. * Warning    : Interrupts can be disabled for a long time if you do a 'broadcast'.  In fact, the
  384. *              interrupt disable time is proportional to the number of tasks waiting on the mailbox.
  385. *********************************************************************************************************
  386. */
  387. #if OS_MBOX_POST_OPT_EN > 0
  388. INT8U  OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
  389. {
  390. #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
  391.     OS_CPU_SR  cpu_sr = 0;
  392. #endif
  393. #if OS_ARG_CHK_EN > 0
  394.     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
  395.         return (OS_ERR_PEVENT_NULL);
  396.     }
  397.     if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
  398.         return (OS_ERR_POST_NULL_PTR);
  399.     }
  400. #endif
  401.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
  402.         return (OS_ERR_EVENT_TYPE);
  403.     }
  404.     OS_ENTER_CRITICAL();
  405.     if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            */
  406.         if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
  407.             while (pevent->OSEventGrp != 0) {         /* Yes, Post to ALL tasks waiting on mailbox     */
  408.                 (void)OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);
  409.             }
  410.         } else {
  411.             (void)OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);  /* No,  Post to HPT waiting on mbox     */
  412.         }
  413.         OS_EXIT_CRITICAL();
  414.         if ((opt & OS_POST_OPT_NO_SCHED) == 0) {
  415.             OS_Sched();                                        /* Find HPT ready to run                */
  416.         }
  417.         return (OS_NO_ERR);
  418.     }
  419.     if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
  420.         OS_EXIT_CRITICAL();
  421.         return (OS_MBOX_FULL);
  422.     }
  423.     pevent->OSEventPtr = msg;                         /* Place message in mailbox                      */
  424.     OS_EXIT_CRITICAL();
  425.     return (OS_NO_ERR);
  426. }
  427. #endif
  428. /*$PAGE*/
  429. /*
  430. *********************************************************************************************************
  431. *                                        QUERY A MESSAGE MAILBOX
  432. *
  433. * Description: This function obtains information about a message mailbox.
  434. *
  435. * Arguments  : pevent        is a pointer to the event control block associated with the desired mailbox
  436. *
  437. *              p_mbox_data   is a pointer to a structure that will contain information about the message
  438. *                            mailbox.
  439. *
  440. * Returns    : OS_NO_ERR           The call was successful and the message was sent
  441. *              OS_ERR_EVENT_TYPE   If you are attempting to obtain data from a non mailbox.
  442. *              OS_ERR_PEVENT_NULL  If 'pevent'      is a NULL pointer
  443. *              OS_ERR_PDATA_NULL   If 'p_mbox_data' is a NULL pointer
  444. *********************************************************************************************************
  445. */
  446. #if OS_MBOX_QUERY_EN > 0
  447. INT8U  OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
  448. {
  449.     INT8U      i;
  450. #if OS_LOWEST_PRIO <= 63
  451.     INT8U     *psrc;
  452.     INT8U     *pdest;
  453. #else
  454.     INT16U    *psrc;
  455.     INT16U    *pdest;
  456. #endif
  457. #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  458.     OS_CPU_SR  cpu_sr = 0;
  459. #endif
  460. #if OS_ARG_CHK_EN > 0
  461.     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
  462.         return (OS_ERR_PEVENT_NULL);
  463.     }
  464.     if (p_mbox_data == (OS_MBOX_DATA *)0) {                /* Validate 'p_mbox_data'                   */
  465.         return (OS_ERR_PDATA_NULL);
  466.     }
  467. #endif
  468.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
  469.         return (OS_ERR_EVENT_TYPE);
  470.     }
  471.     OS_ENTER_CRITICAL();
  472.     p_mbox_data->OSEventGrp = pevent->OSEventGrp;          /* Copy message mailbox wait list           */
  473.     psrc                    = &pevent->OSEventTbl[0];
  474.     pdest                   = &p_mbox_data->OSEventTbl[0];
  475.     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
  476.         *pdest++ = *psrc++;
  477.     }
  478.     p_mbox_data->OSMsg = pevent->OSEventPtr;               /* Get message from mailbox                 */
  479.     OS_EXIT_CRITICAL();
  480.     return (OS_NO_ERR);
  481. }
  482. #endif                                                     /* OS_MBOX_QUERY_EN                         */
  483. #endif                                                     /* OS_MBOX_EN                               */