程序清单L6.15等待一个邮箱中的消息
|
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
|
{
|
void*msg;
|
|
OS_ENTER_CRITICAL();
|
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {(1)
|
OS_EXIT_CRITICAL();
|
*err = OS_ERR_EVENT_TYPE;
|
return ((void *)0);
|
}
|
msg = pevent->OSEventPtr;
|
if (msg != (void *)0) {(2)
|
pevent->OSEventPtr = (void *)0;(3)
|
OS_EXIT_CRITICAL();
|
*err = OS_NO_ERR;
|
} else if (OSIntNesting > 0) {(4)
|
OS_EXIT_CRITICAL();
|
*err = OS_ERR_PEND_ISR;
|
} else {
|
OSTCBCur->OSTCBStat |= OS_STAT_MBOX;(5)
|
OSTCBCur->OSTCBDly= timeout;
|
OSEventTaskWait(pevent);
|
OS_EXIT_CRITICAL();
|
OSSched();
|
OS_ENTER_CRITICAL();
|
if ((msg = OSTCBCur->OSTCBMsg) != (void *)0) {(6)
|
OSTCBCur->OSTCBMsg= (void *)0;
|
OSTCBCur->OSTCBStat= OS_STAT_RDY;
|
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
|
OS_EXIT_CRITICAL();
|
*err= OS_NO_ERR;
|
} else if (OSTCBCur->OSTCBStat & OS_STAT_MBOX) {(7)
|
OSEventTO(pevent);(8)
|
OS_EXIT_CRITICAL();
|
msg= (void *)0;(9)
|
*err= OS_TIMEOUT;
|
} else {
|
msg= pevent->OSEventPtr;(10)
|
pevent->OSEventPtr= (void *)0;(11)
|
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;(12)
|
OS_EXIT_CRITICAL();
|
*err= OS_NO_ERR;
|
}
|
}
|
return (msg);
|
}
|
程序清单L6.18查询邮箱的状态
|
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata)
|
{
|
INT8Ui;
|
INT8U *psrc;
|
INT8U *pdest;
|
|
OS_ENTER_CRITICAL();
|
if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {(1)
|
OS_EXIT_CRITICAL();
|
return (OS_ERR_EVENT_TYPE);
|
}
|
pdata->OSEventGrp = pevent->OSEventGrp;(2)
|
psrc= &pevent->OSEventTbl[0];
|
pdest= &pdata->OSEventTbl[0];
|
for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
|
*pdest++ = *psrc++;
|
}
|
pdata->OSMsg= pevent->OSEventPtr;(3)
|
OS_EXIT_CRITICAL();
|
return (OS_NO_ERR);
|
}
|