os_mbox.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:25k
源码类别:

微处理器开发

开发平台:

C/C++

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