欢迎来到天天文库
浏览记录
ID:33632711
大小:1.08 MB
页数:49页
时间:2019-02-27
《嵌入式实时操作系统μcos原理与实践4》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式实时操作系统μC/原理与实践教材:嵌入式实时操作系统μC/OS原理与实践电子工业出版社作者:卢有亮luyl@uestc.edu.cn电子科技大学能源科学与工程学院第4章事件管理4.1事件管理重要数据结构4.2事件管理程序4.3信号量管理4.4互斥信号量管理4.5事件标志组管理习题μC/OS-II作为实时多任务操作系统,是事件驱动的,支持信号量,消息等机制。事件主要包括信号量和互斥信号量,而事件的组合可以用事件标志组来管理。本章的内容包括事件管理中数据结构,事件管理程序,信号量管理,互斥型信号量管理,以及事件标志组管理。4.1事件管理重要数据结构4.1.1事件控制块ECB事件控制块
2、ECB在事件管理中占据着举足轻重的作用。虽然事件控制块ECB并没有任务控制块TCB的内容丰富,但是在事件处理中仍然是核心的数据结构,频繁被访问。ECB的定义出现在操作系统的头文件ucos_ii.h中。4.1.2事件等待组和事件等待表一个事件块标志着一个事件,等待这个事件的任务在事件块的事件等待组和事件等待表中标记自己的存在,然后被阻塞。当事件发生的时候,操作系统会找到优先级最高的等待事件发生的任务,并将该任务就绪,然后在事件等待组和事件等待表中取消该任务的标记。事件等待组和事件等待表的关系和就绪组与就绪表的关系是完全相同的。上图没有任务等待事件的发生,因此就绪组为0,就绪表的内容也是全
3、0。假设有优先级为20和32的任务在等待事件的发生,那么就绪组和就绪表应如下图所示:4.1.3事件控制块空闲链表事件管理中,将空闲的事件块链接为一个单向的链表,事件控制块空闲链表。这个链表的形式和任务块TCB的空闲链表的形式是完全相同的。当创建一个事件的时候,要在事件控制块ECB空闲链表查找是否有空闲的ECB可用。如果有就从链表中取出分配给事件。要做这件事,首先要找到链表的表头,因此声明了一个重要的全局变量OSEventFreeList指示表头的地址,称之为事件空闲链表指针。OSEventFreeList的定义为:OS_EVENT*OSEventFreeList;在事件控制块初始化程序
4、结束的时候,该链表如图所示。4.2.1事件控制块ECB初始化事件控制块的初始化在操作系统初始化函数OS_Init中被调用事件控制块的初始化函数是OS_InitEventList表4.3ECB初始化函数OS_InitEventList解析ECB初始化函数OS_InitEventList首先清空了所有的ECB块,也就是清空了事件表。然后从0到OS_MAX_EVENTS-1u)循环对除最后一个ECB块之外的所有ECB块进行初始化,并顺便构建了单向的链表。循环结束后最后一个ECB块OSEventTbl[OS_MAX_EVENTS-1]进行初始化。最后一个事件控制块OSEventTbl[OS_M
5、AX_EVENTS-1]的OSEventPtr域指向空地址0,构造完成了如图4-3所示的空闲事件控制块链表。然后将ECB空闲链表的表头地址给OSEventFreeList,初始化完成4.2事件管理程序4.2.2事件等待表初始化当建立一个事件或消息,如信号量、邮箱、消息队列时,如信号量的建立函数OSSemCreate等,需要对事件等待表进行初始化。表4.4事件等待表初始化函数为OS_EventWaitListInit解析pevent->OSEventGrp=0u;/*清空任务等待组*/for(i=0u;iOSEventTbl
6、[i]=0u;/*采用循环模式清空任务等待表*/}4.2.3设置事件等待当任务等待事件发生,并获得事件控制块ECB后,需要在ECB中标记任务在等待事件的发生,才可以在事件发生时取消任务的阻塞。表4.5事件等待函数OS_EventTaskWait解析OS_EventTaskWait做了两件事情:1.标记。在ECB中登记本任务,即在ECB的事件等待表中对应优先级处标记为1,事件等待组中对应位标记为1。2.取消标记。在就绪表和就绪组中取消对该事件就绪的标记,将就绪表中对应优先级处标记为0,如果就绪表该任务所在的一组没有任务就绪,将就绪组中的对应位标记为0。4.2.4取消事件等待OS_Even
7、tTaskRemove是与OS_EventTaskWait相反的操作,当一个事件由于某种原因不再需要等待事件需运行OS_EventTaskRemove。voidOS_EventTaskRemove(OS_TCB*ptcb,OS_EVENT*pevent){INT8Uy;y=ptcb->OSTCBY;pevent->OSEventTbl[y]&=(OS_PRIO)~ptcb->OSTCBBitX;/*在事件等待表中删除事件等待标志*/if(pev
此文档下载收益归作者所有