OS_CORE.C(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;
#endifcase 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*/
#endifOS_EXIT_CRITICAL(); /*开中断*/return (events_rdy_nbr);/*返回就绪事件的数量*/
}
#endif
第二个图主要是来返回消息的,与第一个不同。
OS_CORE.C(3)相关推荐
- OS_CORE.C(11)
OS_SchedNew(void)找到将要运行的最高优先级任务函数 和任务调度函数OS_Sched(void): /* **************************************** ...
- OS_CORE.C(10)
今天看os_core.c文件中的各种初始化函数. OS_EventWaitListInit(OS_EVENT *pevent)初始化事件控制块的等待列表: /*$PAGE*/ /*2018/2/8 * ...
- OS_CORE.C(总结)
在内核的功能模块中,重点函数为: static void OS_InitEventList(void);/*初始化事件列表*/ static void OS_InitMisc(void);/* ...
- OS_CORE.C(1)
第一个函数(获得信号量.互斥量.邮箱或者队列名字的函数)的流程图和分析图如下所示: /*$PAGE*/ /* ********************************************* ...
- OS_CORE.C(9)
本篇介绍以下几个函数: OSVersion()获得版本号函数. OS_Dummy()虚拟函数. OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U ...
- OS_CORE.C(8)
本篇介绍的是OSStart()函数和OSStatInit()函数和OSTimeTick()函数. OSStart()多任务开始函数: /*$PAGE*/ /* ******************** ...
- OS_CORE.C(6)
先介绍一下优先级反转的相关知识: 优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证. 例 ...
- OS_CORE.C(5)
/*$PAGE*/ /* *************************************************************************************** ...
- OS_CORE.C(7)
本篇介绍的是调度器的上锁和解锁: 调度器上锁函数OSSchedlock()的功能是用于禁止任务调度,使任务保持对CPU的控制权. 调度器开锁函数OSSchedUnlock()的功能是解除对任务调度的禁 ...
最新文章
- 数据呈现 | 20大数据可视化工具测评
- HTML中各种位置距离关系
- 2008R2 AD 域的安装
- linux ip addr peer,Linux网络IP设置
- 你知道Integer和int的区别吗
- sql 数组_sql注入中级
- SQL语句大全(2)
- MySQL 数据库设计规范
- 【caffe-windows】 caffe-master 之Matlab中model的分类应用
- win10屏蔽自动更新方法
- 查看已安装java插件_记录下eclipse下的插件安装,查看及删除方式
- treeview wpf代码设置选中_C# WPF过渡效果实现(Transitions)
- python创建字典的两种方法
- pandas:根据条件获取元素所在的位置(索引).index.tolist()
- 高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案,高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案...
- PDF Expert for mac(pdf编辑工具)
- 初次学习Docker没什么经验记录下的笔记
- 步进电机--S 曲线的C算法
- 一个男孩子如果到了23岁,就不会再长高了。。。
- html+p标签和span,文章段落用span和p标签对seo有影响吗