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)相关推荐

  1. OS_CORE.C(11)

    OS_SchedNew(void)找到将要运行的最高优先级任务函数 和任务调度函数OS_Sched(void): /* **************************************** ...

  2. OS_CORE.C(10)

    今天看os_core.c文件中的各种初始化函数. OS_EventWaitListInit(OS_EVENT *pevent)初始化事件控制块的等待列表: /*$PAGE*/ /*2018/2/8 * ...

  3. OS_CORE.C(总结)

    在内核的功能模块中,重点函数为: static  void  OS_InitEventList(void);/*初始化事件列表*/ static  void  OS_InitMisc(void);/* ...

  4. OS_CORE.C(1)

    第一个函数(获得信号量.互斥量.邮箱或者队列名字的函数)的流程图和分析图如下所示: /*$PAGE*/ /* ********************************************* ...

  5. OS_CORE.C(9)

    本篇介绍以下几个函数: OSVersion()获得版本号函数. OS_Dummy()虚拟函数. OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U ...

  6. OS_CORE.C(8)

    本篇介绍的是OSStart()函数和OSStatInit()函数和OSTimeTick()函数. OSStart()多任务开始函数: /*$PAGE*/ /* ******************** ...

  7. OS_CORE.C(6)

    先介绍一下优先级反转的相关知识: 优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证. 例 ...

  8. OS_CORE.C(5)

    /*$PAGE*/ /* *************************************************************************************** ...

  9. OS_CORE.C(7)

    本篇介绍的是调度器的上锁和解锁: 调度器上锁函数OSSchedlock()的功能是用于禁止任务调度,使任务保持对CPU的控制权. 调度器开锁函数OSSchedUnlock()的功能是解除对任务调度的禁 ...

最新文章

  1. 数据呈现 | 20大数据可视化工具测评
  2. HTML中各种位置距离关系
  3. 2008R2 AD 域的安装
  4. linux ip addr peer,Linux网络IP设置
  5. 你知道Integer和int的区别吗
  6. sql 数组_sql注入中级
  7. SQL语句大全(2)
  8. MySQL 数据库设计规范
  9. 【caffe-windows】 caffe-master 之Matlab中model的分类应用
  10. win10屏蔽自动更新方法
  11. 查看已安装java插件_记录下eclipse下的插件安装,查看及删除方式
  12. treeview wpf代码设置选中_C# WPF过渡效果实现(Transitions)
  13. python创建字典的两种方法
  14. pandas:根据条件获取元素所在的位置(索引).index.tolist()
  15. 高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案,高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案...
  16. PDF Expert for mac(pdf编辑工具)
  17. 初次学习Docker没什么经验记录下的笔记
  18. 步进电机--S 曲线的C算法
  19. 一个男孩子如果到了23岁,就不会再长高了。。。
  20. html+p标签和span,文章段落用span和p标签对seo有影响吗

热门文章

  1. SQL 语句使用to_char函数时,检索结果有空格
  2. WireShark过滤器选项
  3. linux备忘录-vi和vim
  4. 移动医疗未来还有多少红利?
  5. 对require和import的认识
  6. 上传图片和导出文件测试用例
  7. 为什么 MySQL 使用 B+ 树,而不是 B 树或者 Hash?
  8. 从 0 开始手写一个 Mybatis 框架,三步搞定!
  9. 一组匹配中国大陆手机号码的正则表达式
  10. Java 洛谷 P1035 级数求和