您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 8-2.Event+Flag
1实时嵌入式操作系统艾云峰aiyunfeng@gmail.comCollegeofComputing&CommunicationEngineeringReal-timeEmbeddedOperatingSystem2主要内容-eventflag1.eventflag概述和使用例子2.UC/OS-II事件标志组管理概述3.UC/OS-II事件标志组管理实现3事件同步独立型同步若任务需要与任何事件之一发生同步,称之为独立型同步关联型同步若任务需要与若干事件同步,可称之外关联型同步4事件标志组(eventflag)又叫做事件寄存器(eventregister),是一个内核对象,由一组跟踪指定事件的二值事件标志位组成可以定义一个包含多个事件标志的事件集合,并由其控制任务是否执行一个事件寄存器可以是8位、16位、32位长,甚至更长,其中的每一位作为二值标志(也称为事件标志),并且可以被设置和清除一个外部源,如另外一个任务或一个ISR,可以设置事件寄存器的位,通知任务一个特别的事件已经发生5事件集合事件集合由多个事件标志所代表的事件组成,一个事件集合可以一个任务相对应,决定任务的执行与否一个事件标志组可以定义多个事件集合,每个事件集合都与一个任务相关联;内核维护事件标志组的所有事件集合任务与事件集合同步(即与事件集合内的所有事件同步)时,可采取独立型同步或者关联型同步的方式6对于事件标志组的典型操作建立一个事件标志组任务等待某个事件集合中的事件标志将事件标志组中的某个事件标志置为或清07事件标志组的使用举例(1)-分析与设计分析:发动机管理系统中,需要监控汽油的压力和温度;当压力和温度正常时,从板载显示仪器上显示正常设计利用三个任务完成该功能,一个任务负责监控汽油的压力,一个任务负责监控汽油的温度,最后一个任务负责在压力和温度正常时进行显示。显示任务只有在压力和温度同时正常的时候才进行外部显示使用事件标志组实现压力正常和温度正常两个事件与显示任务的同步。显示任务首先等待事件标志组中压力和温度两个事件标志;压力监控任务检测到压力正常时,置事件标志组相应位温度监控任务检测到温度正常时,置事件标志组相应位上述两个事件发生时,可使显示任务调度执行8事件标志组的使用举例(2)-实现9主要内容-eventflag1.eventflag的用途和使用例子2.UC/OS-II事件标志组管理3.UC/OS-II事件标志组管理实现10UC/OS-II事件标志组概述UC/OS-II的事件标志组由2部分组成:一是用来保存当前事件组中各事件状态的一些标志位;二是等待这些标志位置位或清除的任务等待列表UC/OS-II提供了6个函数,完成事件标志组的各种功能创立/删除函数:OSFlagCreate()、OSFlagDel();等待函数:OSFlagPend()、OSFlagAccept()置位函数:OSFlagPost()查询函数:OSFlagQuery()11UC/OS-II事件标志组常量配置为使UC/OS-II在编译后生成具有事件标志组功能的代码,必须在OS_CFG.H中选定事件标志组控制选项,即把其中的OS_FLAG_EN常量定义为1UC/OS-II事件标志组操作对应的配置常量:12任务、中断及事件标志组之间的联系此图中用了一个8位的序列表示事件标志组,实际上事件标志组可以是8位、16位或32位时钟沙漏表示OSFlagPend()支持超时机制只有任务才可以调用OSFlagCreate()、OSFlagDel()、OSFlagPend()13内核中事件标志组管理相关的数据结构(1)事件标志组的任务等待列表:双向链表OS_EVENT_TYPE_FLAGOS_FLAG_GRPANDorORANDorORANDorOR00OS_FLAG_NODEOS_TCBOS_TCBOS_TCB.OSTCBFlagNode.OSFlagWaitList.OSFlagFlags.OSFlagType.OSFlagNodeFlagGrp.OSFlagNodeFlag.OSFlagNodeWaitType.OSFlagNodeNext.OSFlagNodePrev.OSFlagNodeTCB14内核中事件标志组管理相关的数据结构(2)事件标志组数据结构:OS_FLAG_GRP应该取值OS_EVENT_TYPE_FLAG包含了一个等待事件标志组的任务列表包含了一系列表明当前事件标志状态的位,可以为8、16、32位15内核中事件标志组管理相关的数据结构(3)数据结构OS_FLAG_NODE用来记录任务在等待哪些事件标志位及等待的方式(与、或)当任务等待某些事件标志位时,就建立一个OS_FLAG_NODE数据结构;当这些等待的事件标志位发生后,这个数据结构被删除。换句话说,当调用OSFlagPend()时,建立OS_FLAG_NODE。用来构建双向链表从过该指针,可以得知哪一个任务在等待事件标志组中的事件指向事件标志组的指针用来表明任务等待事件标志组中的哪些事件标志。该变量可能是816或32位用来知名任务等待事件标志组中所有事件都发生(AND)或任何一个事件发生(OR)16内核初始化后的空闲事件标志组控制块链表OS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagTypeOS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagTypeOSFlagFreeListOS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagType0当创建一个事件标志组时,要从该链表表头处取一个控制块,并付给建立的事件标志组。17主要内容-eventflag1.eventflag的用途和使用例子2.UC/OS-II事件标志组管理3.UC/OS-II事件标志组管理实现18结合例子分析事件标志组操作的实现19OSFlagCreate20建立一个事件标志组,OSFlagCreate()OS_FLAG_GRP*OSFlagCreate(OS_FLAGSflags,INT8U*err)功能:建立并初始化一个事件标志组参数:flags事件标志组的事件标志的初始值Err:指向错误代码的指针OS_NO_ERR:成功创立事件标志组OS_ERR_CREATE_ISR:从中断服务中调用本函数OS_FLAG_GRP_DEPLETED:系统中没有空闲事件标志组返回值如果成功创建事件标志组,则返回指向该事件标志组(控制块)的指针;如果系统没有剩余的空闲事件标志组(控制块),则返回空指针21OSFlagCreate()在例子中的使用22OSFlagCreate()的内核实现OS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagTypeOS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagTypeOSFlagFreeListOS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagType0执行EngineStatus=OSFlagCreate(0x00,&err)OS_FLAG_GRP.OSFlagWaitListOS_EVENT_TYPE_FLAGflagsEngineStatusOS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagTypeOSFlagFreeListOS_FLAG_GRP.OSFlagFlags.OSFlagWaitList.OSFlagType0023OSFlagPend24等待事件标志组的事件标志位(1)-OSFlagPend()OS_FLAGSOSFlagPend(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uwait_type,INT16Utimeout,INT8U*err)功能:用于任务等待事件标志组中的事件标志,可以是多个事件标志的不同组合方式可以等待任意指定事件标志的位置位或清0,也可以是全部指定事件标志位置位或清0如果任务等待的事件标志位条件尚不满足,则任务会挂起,直到指定的事件标志组合发生或指定的等待事件超时参数pgrp:指向事件标志组的指针flags:指定需要检查的位;25等待事件标志组的事件标志位(2)-OSFlagPend()wait_type,定义等待事件标志位的方式OS_FLAG_WAIT_CLR_ALL,所有指定事件标志位清0OS_FLAG_WAIT_CLR_ANY,任意指定事件标志位清0OS_FLAG_WAIT_SET_ALL,所有指定事件标志位置1OS_FLAG_WAIT_SET_ANY,任意指定事件标志位置1如果需要在得到期望的事件标志后恢复该事件标志,则可以调用该函数时,将该参数加上一个常量OS_FLAG_CONSUME,如OS_FLAG_WAIT_CLR_ALL+OS_FLAG_CONSUME返回值如果使用了OS_FLAG_CONSUME选项,则返回清理后的事件标志组事件标志状态;否则,返回OSFlagPend()函数运行结束后的事件标志状态;如果发生了超时,返回026OSFlagPend()在例子中的使用(稍微修改)27OSFlagPend()的内核实现(1)仅考虑OS_FLAG_WAIT_SET_ALL情形:定义一个OS_FLAG_NODE型的变量node判断事件标志组的.OSFlagFlags是否等于第二个参数flags如果相等,表明任务等待的事件标志条件已满足,函数返回;否则,表明任务等待的事件标志条件未满足,把任务加入事件标志组的任务等待列表(具体实现见下页图示),并把任务从就绪表中删除进行任务调度(切换到其它任务,下面是又切换到改任务的执行点)如果是由于超时而返回,则把任务从事件标志组的任务等待列表中删除(见下面OSFlagPost描述),返回超时标志;否则则是等待的事件标志条件满足而被唤醒,无错返回;28OSFlagPend()的内核实现(2)把任务加入事件标志组的任务等待列表:OS_EVENT_TYPE_FLAGOS_FLAG_GRPWati_typeANDorORANDorOR00OS_FLAG_NODEOS_TCBOS_TCBOS_TCB.OSTCBFlagNode.OSFlagWaitList.OSFlagFlags.OSFlagType.OSFlagNodeFlagGrp.OSFlagNodeFlag.OSFlagNodeWaitType.OSFlagNodeNext.OSFlagNodePrev.OSFlagNodeTCB0OSTCBCurflags29OSFlagPost30置位或清0事件标志组中的标志位,OSFlagPost()OS_FLAGSOSFlagPost(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uopt,INT8U*err)功能:用于设置由flags指定的事件标志位。指定的事件标志位可以置位或清除。若OSFlagPost()设置的事件标志位正好满足某个事件标志组的任务,则OSFlagPost将该任务设为就绪参数:pgrp:指向事件标志组的指针flags:指定需要检查的位;Opt:表明是置位指定的事件标志位(opt=OS_FLAG_SET)还是清0指定的事件标志位(opt=OS_FLAG_CLR)返回值事件标志组的新的事件标志状态31OSFlagPost()在例子中的使用32OSFlagPost()的内核实现(1)只考虑opt=OS_FLAG_SET,等待任务指定OS_FLAG_WAIT_SET_ALL的情形设置事件标志组控制块的OSFlagFlags.OSFlagFlags|=flags;遍历事件标志组任务等待列表,依次判断(事件标志组的.OSFlagFlags&任务对应FlagNode的.OSFlagNodeFlags)是否等于.OSFlagNodeFlag
本文标题:8-2.Event+Flag
链接地址:https://www.777doc.com/doc-5055822 .html