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
相对简单,不在分析。