OS_CORE.C(3)

188 阅读3分钟
	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



第二个图主要是来返回消息的,与第一个不同。