ucos 消息邮箱

1:消息邮箱

copy一段文字来说明什么是消息邮箱:

2: 消息邮箱的创建


上面的消息邮箱的创建函数,函数参数为一个指针,将改变量的地址赋值给OSEventPtr,故OSEventPtr中存放的是将要传递的消息的指针。消息邮箱的OSEventType类型为:OS_EVENT_TYPE_MBOX。

3:向邮箱中存放消息


存放消息就是将消息的指针赋值给事件控制块中的OSEventPtr变量,同时在在有任务等待此事件时,调用函数
(void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);此函数中有如下的代码段:

从上面的代码可以知道,可以直接将存取的消息指针赋值给等待此事件优先级最高的任务。
ptcb->OSTCBMsg        =  pmsg;同时将此任务的OSTCBStatPend状态改为:OS_STAT_PEND_OK。

上面的代码将会在消息的获取函数中看到。

4:消息的获取

消息的获取函数为:void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
在此函数中有如下的代码段:

首先判断当前事件控制块中OSEventPtr指针是否为空,当不为空时,则表示此时已经有消息存在,直接将此消息指针返回。如果为空时,将当前任务的任务状态改为:OSTCBStat     |= OS_STAT_MBOX; 表示此任务因为等待消息邮箱事件而挂起(OSTCBStatPend  = OS_STAT_PEND_OK)。接着调用函数OS_EventTaskWait (OS_EVENT *pevent)使任务从就选表中删除,同时在事件等待表中记录此任务。在此函数中有:
OSTCBCur->OSTCBEventPtr = pevent;      /* Store ptr to ECB in TCB         */
表示当前任务正在等待的时间控制块。之后进行任务调度,当通过函数  OSMboxPost (OS_EVENT *pevent, void *pmsg)发送一个消息队列的时候时会将最高优先级的任务的OSTCBStatPend的变量赋值为:OS_STAT_PEND_OK,当等待的消息获取到之后,函数OSMboxPend()继续向下执行,通过case条件来执行不同的处理:
    switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted  */
        case OS_STAT_PEND_OK:
             pmsg =  OSTCBCur->OSTCBMsg;
            *perr =  OS_ERR_NONE;
             break;
        case OS_STAT_PEND_ABORT:
             pmsg = (void *)0;
            *perr =  OS_ERR_PEND_ABORT;/* Indicate that we aborted   */
             break;
        case OS_STAT_PEND_TO:
        default:
             OS_EventTaskRemove(OSTCBCur, pevent);
             pmsg = (void *)0;
            *perr =  OS_ERR_TIMEOUT;/* Indicate that we didn't get event within TO*/
             break;
    }
之后将当前任务中的OSTCBEventPtr ,OSTCBMsg  进行赋空值操作。       
    OSTCBCur->OSTCBStat          =  OS_STAT_RDY; /* Set   task  status to ready  */
    OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;  /* Clear pend  status*/
    OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;    /* Clear event pointers  */
#if (OS_EVENT_MULTI_EN > 0)
    OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
#endif
    OSTCBCur->OSTCBMsg           = (void      *)0;    /* Clear  received message*/                      

5: 其他函数

OSMboxDel(),OSMboxAccept(),
INT8U  OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)函数中的:opt,
*              opt           determines the type of ABORT performed:
*      _PEND_OPT_NONE                     ABORT wait for a single task (HPT) waiting on the mailbox
*       OS_PEND_OPT_BROADCAST    ABORT wait for ALL tasks that are  waiting on the  mailbox
相对简单,不在分析。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值