金牌会员
- 积分
- 1125
- 金钱
- 1125
- 注册时间
- 2016-11-9
- 在线时间
- 96 小时
|
发表于 2019-12-5 15:25:42
|
显示全部楼层
void OSSemPend (OS_EVENT *pevent,INT32U timeout, INT8U *perr)
void *OSMboxPend (OS_EVENT *pevent, INT32U timeout,INT8U *perr)
这类函数的第二个参数在传入0时,是一直等待到事件发生,才继续运行;
如果要是非0,就在等待了这些时间之后,继续运行这个任务,因为timeout超时导致
任务继续运行的时候,把这个TCB的OSTCBStatPend 赋值OS_STAT_PEND_TO指示,
OS_STAT_PEND_OK是正常情况的,OS_STAT_PEND_ABORT应该和OSSemPendAbort这类函数有关,具体的目前还不清楚,没用到。
下列代码是判断已经延时的任务的延时时间是否到达:
while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) { /* Go through all TCBs in TCB list */
OS_ENTER_CRITICAL();
if (ptcb->OSTCBDly != 0u) { /* No, Delayed or waiting for event with TO */
ptcb->OSTCBDly--; /* Decrement nbr of ticks to end of delay */
if (ptcb->OSTCBDly == 0u) { /* Check for timeout */
if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
ptcb->OSTCBStat &= (INT8U)~(INT8U)OS_STAT_PEND_ANY; /* Yes, Clear status flag */
ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
} else {
ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
}
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
}
}
}
ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
OS_EXIT_CRITICAL();
} |
|