[uCOS/RTOS] ucos中邮箱发送的消息可以是0吗?

[复制链接]
2182|4
 楼主| zdes2006 发表于 2017-2-27 20:13 | 显示全部楼层 |阅读模式
ucos中邮箱发送的消息可以是0吗?或者说:ucos中邮箱没消息和消息是0怎么区分?
airwill 发表于 2017-3-5 10:50 | 显示全部楼层
没有做过这个测试, 消息的值当然也可以是 0, 系统不会屏蔽这个值

你可以测试一下
hgjinwei 发表于 2017-3-6 08:25 | 显示全部楼层
本帖最后由 hgjinwei 于 2017-3-6 08:28 编辑

理论上不可以。
  1. INT8U  OSMboxPost (OS_EVENT *pevent, void *pmsg)
  2. {
  3. #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
  4.     OS_CPU_SR  cpu_sr = 0;
  5. #endif



  6. #if OS_ARG_CHK_EN > 0
  7.     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
  8.         return (OS_ERR_PEVENT_NULL);
  9.     }
  10. <font color="Red"><u>    if (pmsg == (void *)0) {                          /* Make sure we are not posting a NULL pointer   */
  11.         return (OS_ERR_POST_NULL_PTR);
  12.     }</u></font>
  13. #endif
  14.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
  15.         return (OS_ERR_EVENT_TYPE);
  16.     }
  17.     OS_ENTER_CRITICAL();
  18.     if (pevent->OSEventGrp != 0) {                    /* See if any task pending on mailbox            */
  19.                                                       /* Ready HPT waiting on event                    */
  20.         (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
  21.         OS_EXIT_CRITICAL();
  22.         OS_Sched();                                   /* Find highest priority task ready to run       */
  23.         return (OS_ERR_NONE);
  24.     }
  25.     if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
  26.         OS_EXIT_CRITICAL();
  27.         return (OS_ERR_MBOX_FULL);
  28.     }
  29.     pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */
  30.     OS_EXIT_CRITICAL();
  31.     return (OS_ERR_NONE);
  32. }


如果“OS_ARG_CHK_EN”开启,直接就返回“OS_ERR_POST_NULL_PTR”错误(见13-15行)。

如果“OS_ARG_CHK_EN”不开启,此时是可以将消息发往邮箱的,但是,
  1. void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
  2. {
  3.     void      *pmsg;
  4.     INT8U      pend_stat;
  5. #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
  6.     OS_CPU_SR  cpu_sr = 0;
  7. #endif



  8. #if OS_ARG_CHK_EN > 0
  9.     if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
  10.         return ((void *)0);
  11.     }
  12.     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
  13.         *perr = OS_ERR_PEVENT_NULL;
  14.         return ((void *)0);
  15.     }
  16. #endif
  17.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
  18.         *perr = OS_ERR_EVENT_TYPE;
  19.         return ((void *)0);
  20.     }
  21.     if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
  22.         *perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
  23.         return ((void *)0);
  24.     }
  25.     if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
  26.         *perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
  27.         return ((void *)0);
  28.     }
  29.     OS_ENTER_CRITICAL();
  30.     pmsg = pevent->OSEventPtr;
  31. <font color="Red"><u>    if (pmsg != (void *)0) {                          /* See if there is already a message             */
  32.         pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
  33.         OS_EXIT_CRITICAL();
  34.         *perr = OS_ERR_NONE;
  35.         return (pmsg);                                /* Return the message received (or NULL)         */
  36.     }</u></font>
  37.     OSTCBCur->OSTCBStat     |= OS_STAT_MBOX;          /* Message not available, task will pend         */
  38.     OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
  39.     OSTCBCur->OSTCBDly       = timeout;               /* Load timeout in TCB                           */
  40.     OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
  41.     OS_EXIT_CRITICAL();
  42.     OS_Sched();                                       /* Find next highest priority task ready to run  */
  43.     OS_ENTER_CRITICAL();
  44.     if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we weren't given the message           */
  45.         pend_stat = OSTCBCur->OSTCBStatPend;
  46.         OS_EventTOAbort(pevent);                      /* Timed out, Make task ready                    */
  47.         OS_EXIT_CRITICAL();
  48.         switch (pend_stat) {
  49.             case OS_STAT_PEND_TO:
  50.             default:
  51.                  *perr = OS_ERR_TIMEOUT;              /* Indicate that a timeout occured               */
  52.                  break;

  53.             case OS_STAT_PEND_ABORT:
  54.                  *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted                      */
  55.                  break;
  56.         }
  57.         return ((void *)0);                           /* Return a NULL message                         */
  58.     }
  59.     pmsg                    = OSTCBCur->OSTCBMsg;
  60.     OSTCBCur->OSTCBMsg      = (void *)0;              /* Yes, clear message received                   */
  61.     OSTCBCur->OSTCBStat     = OS_STAT_RDY;
  62.     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;          /* No longer waiting for event                   */
  63.     OS_EXIT_CRITICAL();
  64.     *perr                   = OS_ERR_NONE;
  65.     return (pmsg);                                    /* Return the message received                   */
  66. }

此消息只能发给当前正在等待消息的任务,如果此时没有任务等待消息,此消息将被忽略(见34-39行)。
flyywq 发表于 2017-4-6 09:45 | 显示全部楼层
可以的,只要发送的是地址
夏亦初阳 发表于 2017-4-18 15:50 | 显示全部楼层
只要发送的邮箱地址不为0,邮箱内的数据为0是可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部