非常完美的函数
#if OS_EVENT_EN > 0
INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
{
OS_TCB *ptcb;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
INT8U prio;
y = OSUnMapTbl[pevent->OSEventGrp];
bity = OSMapTbl[y];
x = OSUnMapTbl[pevent->OSEventTbl[y]];
bitx = OSMapTbl[x];
prio = (INT8U)((y << 3) + x);
pevent->OSEventTbl[y] &= ~bitx;
if (pevent->OSEventTbl[y] == 0x00)
{
pevent->OSEventGrp &= ~bity;
}
ptcb = OSTCBPrioTbl[prio];
ptcb->OSTCBDly = 0;
ptcb->OSTCBEventPtr = (OS_EVENT *)0;
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
ptcb->OSTCBMsg = msg;
#else
msg = msg;
#endif
ptcb->OSTCBStat &= ~msk;
if (ptcb->OSTCBStat == OS_STAT_RDY) {
OSRdyGrp |= bity;
OSRdyTbl[y] |= bitx;
}
return (prio);
}
#endif
为什么是完美的?
因为他很好的把任务的等待列表与任务很好的结合起来。
具体的过程是这样的:
通过任务等待列表OSEvnetGrp和OSEventTbl找到等待事件的任务的优先级,在通过任务的优先级在数组OSTCBPrioTbl[prio]; 中找到相应的任务控制块,通过任务控制块使任务的状态是就绪态,任务的延迟是0,任务的事件指针0,这样就是这个任务处于就绪状态。
他被调用的函数是OSSemSend()?
原因是,要是释放信号量那么具有相应的任务去使用信号量。