OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ...无法获得资源的话就将其挂起 */
OS_STAT_MULTI;
OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; //配置当前事件控制块中的事件状态标志为等待完成,因为这个事件即将被切换掉,进入挂起态
OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB设置该任务挂起等待的时间为timeout时间,超时任务就被切换掉*/
OS_EventTaskWaitMulti(pevents_pend); /* Suspend task until events or timeout occurs 暂停任务直到出现新的事件呼叫或者挂起时间到*/
OS_EXIT_CRITICAL(); /*开中断*/
OS_Sched(); /* Find next highest priority task ready找下一个就绪的最高优先级任务 */
OS_ENTER_CRITICAL(); /*关中断*/
switch (OSTCBCur->OSTCBStatPend) { /* Handle event posted, aborted, or timed-out对当前最高优先级的事件进行状态判断*/
case OS_STAT_PEND_OK:
case OS_STAT_PEND_ABORT: /*等待完成和等待终止都进行相同的处理*/
pevent = OSTCBCur->OSTCBEventPtr; /*将当前任务控制块中指向事件的指针赋值给pevent*/
if (pevent != (OS_EVENT *)0) { /* If task event ptr != NULL, ...如果任务事件指针不为空,说明有任务就绪*/
*pevents_rdy++ = pevent; /* ... return available event ..将这个事件返回到就绪事件数组*/
*pevents_rdy = (OS_EVENT *)0; /* ... & NULL terminate return event array最后一个标志位结束符*/
events_rdy_nbr++; /*将就绪事件的数目加1*/
}
else { /* Else NO event available, handle as timeout没有事件是准备好的,按照超时处理*/
OSTCBCur->OSTCBStatPend = OS_STAT_PEND_TO;/*将此时任务控制块挂起状态设置为时间用完状态*/
OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);/*将任务从事件等待队列中删除*/
}
break;
case OS_STAT_PEND_TO: /* If events timed out, ...如果事件的时间用完了*/
default: /* ... remove task from events' wait lists 将任务从事件等待列表中删除 */
OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
break;
}
\
//下面这个switch是用来返回消息的
switch (OSTCBCur->OSTCBStatPend) { /*对当前最高优先级任务状态进行判断*/
case OS_STAT_PEND_OK: /*状态为等待完成(正常完成)*/
switch (pevent->OSEventType) { /* Return event's message返回事件的消息*/
#if (OS_SEM_EN > 0u)
case OS_EVENT_TYPE_SEM: /*如果事件类型为信号量,消息返回为0*/
*pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores信号量没有消息*/
break;
#endif
#if ((OS_MBOX_EN > 0u) || \ /*如果是邮箱或者队列,处理方法一致*/
((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))
case OS_EVENT_TYPE_MBOX:
case OS_EVENT_TYPE_Q:
*pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg; /* Return received message返回收到的消息*/
break;
#endif
case OS_EVENT_TYPE_MUTEX: /*如果是互斥量或是标志或是默认*/
case OS_EVENT_TYPE_FLAG:
default:
OS_EXIT_CRITICAL(); /*开中断*/
*pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array将NULL返回给事件数组 */
*perr = OS_ERR_EVENT_TYPE; /*将错误类型设置为OS_ERR_EVENT_TYPE*/
return (events_rdy_nbr); /*返回就绪事件的数量*/
}
*perr = OS_ERR_NONE; /*如果不是互斥量或标志或默认,将错误类型设置为OS_ERR_NONE*/
break;
case OS_STAT_PEND_ABORT: /*如果当前最高优先级任务状态为等待终止(取消等待)*/
*pmsgs_rdy++ = (void *)0; /* NO message returned for abort没有返回的消息*/
*perr = OS_ERR_PEND_ABORT; /* Indicate that event aborted将错误信息设置为OS_ERR_PEND_ABORT,表示事件被取消*/
break;
case OS_STAT_PEND_TO: /*如果当前最高优先级任务状态为超时*/
default: /*默认状态*/
*pmsgs_rdy++ = (void *)0; /* NO message returned for timeout超时情况下没有消息返回*/
*perr = OS_ERR_TIMEOUT; /* Indicate that events timed out将错误信息设置为超时OS_ERR_TIMEOUT*/
break;
}
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清除事件指针。将当前任务控制块中指向事件的指针设置为0*/
OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;/*将当前任务控制块中指向多个事件的指针设置为0*/
#if ((OS_MBOX_EN > 0u) || \
((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))
OSTCBCur->OSTCBMsg = (void *)0; /* Clear task message清除任务消息。将当前任务控制块中指向消息的指针设置为0*/
#endif
OS_EXIT_CRITICAL(); /*开中断*/
return (events_rdy_nbr);/*返回就绪事件的数量*/
}
#endif
第二个图主要是来返回消息的,与第一个不同。