第6章 同步互斥与通信PPT讲稿.ppt
第6章 同步互斥与通信1第1页,共92页,编辑于2022年,星期一主要内容主要内容 v信号量信号量v邮箱和消息队列邮箱和消息队列v事件事件v异步信号异步信号*2第2页,共92页,编辑于2022年,星期一6.1概述概述 v多任务系统中任务之间的关系多任务系统中任务之间的关系相互独立相互独立仅竞争仅竞争CPU资源资源竞争除竞争除CPU外的其他资源(互斥)外的其他资源(互斥)同步同步协调彼此运行的步调协调彼此运行的步调通信通信彼此间传递数据或信息,以协同完彼此间传递数据或信息,以协同完成某项工作成某项工作3第3页,共92页,编辑于2022年,星期一概述概述 v任务能以以下方式与中断处理程序或其他任任务能以以下方式与中断处理程序或其他任务进行同步或通信:务进行同步或通信:单向同步或通信单向同步或通信:一个任务与另一个任务或一个:一个任务与另一个任务或一个ISR同步或通信。同步或通信。双向同步或通信双向同步或通信:两个任务相互同步或通信。双向同:两个任务相互同步或通信。双向同步不能在任务与步不能在任务与ISR之间进行,因为之间进行,因为ISR不能等待。不能等待。4第4页,共92页,编辑于2022年,星期一概述概述 说明:图中的旗帜标志着某一事件的发生信号。说明:图中的旗帜标志着某一事件的发生信号。5第5页,共92页,编辑于2022年,星期一概述概述 v在嵌入式多任务系统中,任务间的在嵌入式多任务系统中,任务间的耦合程度耦合程度是不是不一样的:一样的:耦合程度较高耦合程度较高:任务之间需要进行大量的通信,相:任务之间需要进行大量的通信,相应的系统开销较大;应的系统开销较大;耦合程度较低耦合程度较低:任务之间不存在通信需求,其间的:任务之间不存在通信需求,其间的同步关系很弱甚至不需要同步或互斥,系统开销同步关系很弱甚至不需要同步或互斥,系统开销较小。较小。v研究任务间耦合程度的高低对于合理地设计研究任务间耦合程度的高低对于合理地设计应用系统、划分任务有很重要的作用。应用系统、划分任务有很重要的作用。6第6页,共92页,编辑于2022年,星期一概述概述 v在单处理器平台上,嵌入式操作系统内核提供在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:的同步、互斥与通信机制主要包括:信号量信号量(semaphore),用于互斥与同步),用于互斥与同步事件(组)事件(组)(eventgroup),用于同步),用于同步异步信号异步信号(asynchronoussignal),用于同步),用于同步邮箱邮箱(mailbox)、)、消息队列消息队列(messagequeue)或或管道管道(pipe),用于消息通信),用于消息通信7第7页,共92页,编辑于2022年,星期一概述概述 v以下一些机制也可用于同步与通信(在单处理器或以下一些机制也可用于同步与通信(在单处理器或多处理器系统中):多处理器系统中):全局变量全局变量共享内存共享内存Sockets远程过程调用(远程过程调用(RemoteProcedureCall)8第8页,共92页,编辑于2022年,星期一概述概述 多个任务共享内存空间多个任务共享内存空间9第9页,共92页,编辑于2022年,星期一6.2信号量信号量 v信号量的种类及用途信号量的种类及用途v互斥信号量互斥信号量v二值信号量二值信号量v计数信号量计数信号量v信号量机制的主要数据结构信号量机制的主要数据结构v信号量的主要功能信号量的主要功能10第10页,共92页,编辑于2022年,星期一6.2.1信号量的种类及用途信号量的种类及用途 v信号量用于实现任务与任务之间、任务与中断信号量用于实现任务与任务之间、任务与中断处理程序之间的处理程序之间的同步同步与与互斥互斥。v信号量一般分为三种:信号量一般分为三种:用于解决互斥问题的用于解决互斥问题的互斥信号量互斥信号量。它比较特殊,可能会。它比较特殊,可能会引起优先级反转问题。引起优先级反转问题。用于解决同步问题的用于解决同步问题的二值信号量二值信号量。用于解决资源计数问题的用于解决资源计数问题的计数信号量计数信号量。v将信号量进行种类细分,可以根据其用途,在具体实将信号量进行种类细分,可以根据其用途,在具体实现时做专门处理,提高执行效率和可靠性。现时做专门处理,提高执行效率和可靠性。11第11页,共92页,编辑于2022年,星期一6.2.2互斥信号量互斥信号量 v用互斥信号量保护的代码区称作用互斥信号量保护的代码区称作“临界区临界区”,临界区代码通常用于,临界区代码通常用于对对共享资源共享资源的访问。的访问。v互斥信号量的值被初始化成互斥信号量的值被初始化成1,表明目前没有任务进入,表明目前没有任务进入“临界区临界区”,但,但最多只有一个任务可以进入最多只有一个任务可以进入“临界区临界区”。v第一个试图进入第一个试图进入“临界区临界区”的任务将成功获得互斥信号量,而随后试图进入的任务将成功获得互斥信号量,而随后试图进入用同一信号量保护的临界区的所有其他任务就必须等待。用同一信号量保护的临界区的所有其他任务就必须等待。v当任务离开当任务离开“临界区临界区”时,它将释放信号量并允许正在等待该信号时,它将释放信号量并允许正在等待该信号量的任务进入量的任务进入“临界区临界区”。Task1Task2共享资源共享资源12第12页,共92页,编辑于2022年,星期一6.2.3二值信号量二值信号量 v二值信号量主要用于二值信号量主要用于任务与任务之间任务与任务之间、任务与任务与中断服务程序之间中断服务程序之间的同步的同步用于同步的二值信号量初始值为用于同步的二值信号量初始值为0,表示同步事件,表示同步事件尚未产生;尚未产生;任务任务申请信号量申请信号量以等待该同步事件的发生;以等待该同步事件的发生;另一个任务或另一个任务或ISR到达同步点时,到达同步点时,释放信号量释放信号量(将其值(将其值设置为设置为1)表示同步事件已发生,以唤醒等待的任务。)表示同步事件已发生,以唤醒等待的任务。13第13页,共92页,编辑于2022年,星期一二值信号量二值信号量 用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步vvTask2Task2优先级高于优先级高于优先级高于优先级高于Task1Task1vvsem1sem1和和和和sem2sem2的初始值均为的初始值均为的初始值均为的初始值均为0 014第14页,共92页,编辑于2022年,星期一6.2.4计数信号量计数信号量 v计数信号量用于控制系统中共享资源的多个实例的使用,计数信号量用于控制系统中共享资源的多个实例的使用,允许多个任务同时访问同一种资源的多个实例允许多个任务同时访问同一种资源的多个实例v计数信号量被初始化为计数信号量被初始化为n(非负整数),(非负整数),n为该种共享资源为该种共享资源的数目。的数目。Task1Task2Task3共享资源实例共享资源实例1共享资源实例共享资源实例15第15页,共92页,编辑于2022年,星期一二值信号量二值信号量 有界缓冲问题有界缓冲问题16第16页,共92页,编辑于2022年,星期一计数信号量计数信号量 生产者任务和消费者任务问题。生产者任务和消费者任务问题。1生产者任务生产者任务do产生一个数据项产生一个数据项申请申请empty申请申请mutex将新生成的数据项添加到缓冲中将新生成的数据项添加到缓冲中释放释放mutex释放释放fullwhile(1);2消费者任务消费者任务do申请申请full申请申请mutex从缓冲中移出一个数据项的内容从缓冲中移出一个数据项的内容释放释放mutex释放释放empty消费新获得的数据项内容消费新获得的数据项内容while(1);Mutex互斥信号量互斥信号量Empty,full0n计数信号量计数信号量17第17页,共92页,编辑于2022年,星期一6.2.5信号量机制的主要数据结构信号量机制的主要数据结构 v信号量控制块信号量控制块:管理所有创建的信号量,内核:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块在系统运行时动态分配和回收信号量控制块v互斥和二值信号量控制块结构互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue任务等待队列任务等待队列attributes信号量属性信号量属性wait_discipline任务等待信号量的方式任务等待信号量的方式priority_ceiling 优先级天花板值优先级天花板值lock是否被占有是否被占有holder拥有者拥有者count当前计数值当前计数值18第18页,共92页,编辑于2022年,星期一信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-II v事件控制块事件控制块ECB同步与通信机制的基本数据结同步与通信机制的基本数据结构构typedefstructINT8UOSEventType;/事件类型事件类型INT8UOSEventGrp;/等待任务所在的组等待任务所在的组INT16UOSEventCnt;/计数器(信号量)计数器(信号量)void*OSEventPtr;/指向消息或消息队列的指针指向消息或消息队列的指针INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任务列表等待任务列表OS_EVENT;19第19页,共92页,编辑于2022年,星期一信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-II v当一个事件发生后,当一个事件发生后,等待事件列表中优等待事件列表中优先级最高的任务先级最高的任务(即在(即在.OSEventTbl&OSEventGrp中所有被中所有被置置1的位中优先级数的位中优先级数值最小的任务)得值最小的任务)得到该事件。到该事件。20176543108915 1413 12 1118161723 2221 20 1926242531 3029 28 2734323339 3837 36 3542404147 4645 44 4350484955 5453 52 5158565763 6261 60 59OSRdyTbl8OSRdyTbl8OSEventGrpOSEventPtrOSEventCntOSEventTypepreventOS_Event20第20页,共92页,编辑于2022年,星期一最低优先级任务最低优先级任务(即空闲任务,不可能处于等待状态即空闲任务,不可能处于等待状态)56575859606162634849505152535455404142434445464732333435363738392425262728293031161718192021222389101112131415012345670123456701234567.OSEventGrpOSEventTblOS_LOWEST_PRIO/8+1XY 最高优先级任务最高优先级任务正在等待该事件的任务的优先级正在等待该事件的任务的优先级XXXYYY00任任务的的优先先级.OSEventTbl中相应位的位置中相应位的位置.OSEventGrp中相应位的位置及中相应位的位置及.OSEventTbl中的中的数数组下下标v当当.OSEventTbln中的任何一位为中的任何一位为1时,时,OSEventGrp中的第中的第n位为位为1。v与任务就绪列表类似!与任务就绪列表类似!21第21页,共92页,编辑于2022年,星期一信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-II v将一个任务插入到等待事件的任将一个任务插入到等待事件的任务列表中:务列表中:pevent-OSEventGrp|=OSMapTblprio3;pevent-OSEventTblprio3|=OSMapTblprio&0 x07;v与将一个任务插入到就绪列表中与将一个任务插入到就绪列表中的操作类似!的操作类似!IndexBitmask(Binary)0 00000001 1 00000010 2 00000100 3 00001000 4 00010000 5 00100000 6 01000000 7 1000000022第22页,共92页,编辑于2022年,星期一信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-II v从等待事件的任务列表中使任务脱离等待状态从等待事件的任务列表中使任务脱离等待状态if(pevent-OSEventTblprio3&=OSMapTblprio&0 x07)=0)pevent-OSEventGrp&=OSMapTblprio3;v与将任务从就绪列表中清除的操作类似!与将任务从就绪列表中清除的操作类似!23第23页,共92页,编辑于2022年,星期一信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-II v在等待事件的任务列表中查找优先级最高的任务在等待事件的任务列表中查找优先级最高的任务y=OSUnMapTblpevent-OSEventGrp;x=OSUnMapTblpevent-OSEventTbly;prio=(yOSEventPtr;if(pevent!=(OS_EVENT*)0)/初始化初始化ECB的各个域的各个域pevent-OSEventType=OS_EVENT_TYPE_SEM;/事件类型为信号量事件类型为信号量pevent-OSEventCnt=cnt;/信号量的初始计数值信号量的初始计数值pevent-OSEventPtr=(void*)0;OS_EventWaitListInit(pevent);/初始化等待初始化等待任务列表任务列表return(pevent);/调用者需检查返回值,如果为调用者需检查返回值,如果为NULL则表示建立失败则表示建立失败31第31页,共92页,编辑于2022年,星期一2.获取(申请)信号量获取(申请)信号量 v功能:试图获得应用指定的信号量。功能:试图获得应用指定的信号量。if信号量的值大于信号量的值大于0then将信号量的值减将信号量的值减1else根据接收信号量的选项,将任务放到根据接收信号量的选项,将任务放到等待队列中,或是直接返回等待队列中,或是直接返回32第32页,共92页,编辑于2022年,星期一获取(申请)信号量获取(申请)信号量 v当所申请的信号量不能被立即获得时,可以有以下当所申请的信号量不能被立即获得时,可以有以下几种选择:几种选择:永远等待永远等待不等待,立即返回,并返回一个错误状态码不等待,立即返回,并返回一个错误状态码指定等待时限(可有效避免死锁)指定等待时限(可有效避免死锁)注意:注意:不允许在不允许在ISR中选择等待中选择等待当任务选择等待时,将被按当任务选择等待时,将被按FIFO或或优先级顺序优先级顺序放置放置在等待队列中在等待队列中33第33页,共92页,编辑于2022年,星期一获取(申请)信号量获取(申请)信号量 v如果任务等待一个使用如果任务等待一个使用优先级继承算法优先级继承算法的互斥信的互斥信号量,且它的优先级高于当前正占有此信号量号量,且它的优先级高于当前正占有此信号量的任务的优先级,那么占有信号量的任务将继的任务的优先级,那么占有信号量的任务将继承这个被阻塞的任务的优先级。承这个被阻塞的任务的优先级。v如果任务成功地获得一个采用如果任务成功地获得一个采用优先级天花板算优先级天花板算法法的互斥信号量,它的优先级又低于优先级的互斥信号量,它的优先级又低于优先级天花板,那么它的优先级将被抬升至天花板。天花板,那么它的优先级将被抬升至天花板。34第34页,共92页,编辑于2022年,星期一获取(等待)一个信号量获取(等待)一个信号量OSSemPend()voidOSSemPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)if(pevent-OSEventCnt0)/信号量值大于信号量值大于0,成功获得信号量并返回,成功获得信号量并返回pevent-OSEventCnt-;*err=OS_NO_ERR;return;OSTCBCur-OSTCBStat|=OS_STAT_SEM;/设置任务状态为等待信号量设置任务状态为等待信号量OSTCBCur-OSTCBDly=timeout;/设置等待时限设置等待时限OS_EventTaskWait(pevent);/将任务放置到信号量的等待列表中将任务放置到信号量的等待列表中OS_Sched();/内核实施内核实施任务调度,系统切换到另一就绪任务执行任务调度,系统切换到另一就绪任务执行if(OSTCBCur-OSTCBStat&OS_STAT_SEM)/判断任务恢复执行的原因,如果等待时限超时但仍然未获判断任务恢复执行的原因,如果等待时限超时但仍然未获得信号量,则返回超时信息得信号量,则返回超时信息OSEventTO(pevent);*err=OS_TIMEOUT;return;OSTCBCur-OSTCBEventPtr=(OS_EVENT*)0;*err=OS_NO_ERR;/任务由于获得信号量而恢复执行,本调用成功返回任务由于获得信号量而恢复执行,本调用成功返回35第35页,共92页,编辑于2022年,星期一获取(无等待地请求)一个信号量获取(无等待地请求)一个信号量OSSemAccept()INT16UOSSemAccept(OS_EVENT*pevent)INT16Ucnt;cnt=pevent-OSEventCnt;if(cnt0)pevent-OSEventCnt-;return(cnt);注意:即使不能成功获得信号量(返回值为注意:即使不能成功获得信号量(返回值为0),调用者),调用者也不会被阻塞。此函数可以在中断处理程序中使用。也不会被阻塞。此函数可以在中断处理程序中使用。36第36页,共92页,编辑于2022年,星期一3.释放信号量释放信号量 v功能:释放一个应用指定的信号量。功能:释放一个应用指定的信号量。if没有任务等待这个信号量没有任务等待这个信号量then信号量的值加信号量的值加1else将信号量分配给一个等待任务(将相应的将信号量分配给一个等待任务(将相应的任务移出等待队列,使其就绪)任务移出等待队列,使其就绪)v如果使用了如果使用了优先级继承优先级继承或或优先级天花板优先级天花板算法,算法,那么执行该功能(系统调用)的任务的优先那么执行该功能(系统调用)的任务的优先级将恢复到原来的高度。级将恢复到原来的高度。37第37页,共92页,编辑于2022年,星期一释放一个信号量释放一个信号量OSSemPost()INT8UOSSemPost(OS_EVENT*pevent)if(pevent-OSEventGrp!=0 x00)/如果有任务在等待该信号量如果有任务在等待该信号量OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/使使等待任务列表中优先级最高的任务就绪等待任务列表中优先级最高的任务就绪OS_Sched();/内核实施任务内核实施任务调度调度return(OS_NO_ERR);/成功返回成功返回if(pevent-OSEventCntOSEventCnt+;/信号量的值加信号量的值加1return(OS_NO_ERR);/成功返回成功返回return(OS_SEM_OVF);/信号量溢出信号量溢出38第38页,共92页,编辑于2022年,星期一4.删除信号量删除信号量 v功能:从系统中删除应用指定的一个信号量功能:从系统中删除应用指定的一个信号量v内核动作:将信号量控制块返还给系统内核动作:将信号量控制块返还给系统v删除信号量的不一定是创建信号量的任务删除信号量的不一定是创建信号量的任务v如果有任务正在等待获得该信号量,执行此功如果有任务正在等待获得该信号量,执行此功能将使所有等待这个信号量的任务回到就绪队能将使所有等待这个信号量的任务回到就绪队列中,且返回一个状态码指示该信号量已被删列中,且返回一个状态码指示该信号量已被删除除39第39页,共92页,编辑于2022年,星期一删除一个信号量删除一个信号量OSSemDel()OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err)BOOLEANtasks_waiting;if(pevent-OSEventGrp!=0 x00/根据是否有任务在等待信号量设置等待标志根据是否有任务在等待信号量设置等待标志tasks_waiting=TRUE;elsetasks_waiting=FALSE;switch(opt)caseOS_DEL_NO_PEND:/如果有任务等待信号量则不删除信号量如果有任务等待信号量则不删除信号量if(task_waiting=FALSE/没有任务等待,释放没有任务等待,释放ECB回空闲链回空闲链pevent-OSEventType=OS_EVENT_TYPE_UNUSED;pevent-OSEventPtr=OSEventFreeList;OSEventFreeList=pevent;/调整空闲调整空闲ECB链头链头指针指针*err=OS_NO_ERR;return(OS_EVENT)0);else*err=OS_ERR_TASK_WAITING;/有任务等待,删除信号量失败有任务等待,删除信号量失败return(pevent);40第40页,共92页,编辑于2022年,星期一删除一个信号量删除一个信号量OSSemDel()caseOS_DEL_ALWAYS:/无论有无任务等待都删除信号量无论有无任务等待都删除信号量/将等待列表中的每个任务都设置成就绪将等待列表中的每个任务都设置成就绪while(pevent-OSEventGrp!=0 x00)OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/释放该信号量的释放该信号量的ECB回空闲控制块链回空闲控制块链 pevent-OSEventType=OS_EVENT_TYPE_UNUSED;pevent-OSEventFreeList;OSEventFreeList=pevent;/如果之前有任务等待信号量,内核实施任务调度如果之前有任务等待信号量,内核实施任务调度if(tasks_waiting=TRUE)OS_Sched();*err=OS_NO_ERR;return(OS_EVENT*)0);default:*err=OS_ERR_INVALID_OPT;return(pevent);41第41页,共92页,编辑于2022年,星期一6.3邮箱和消息队列邮箱和消息队列 v概述概述v消息队列机制的主要数据结构消息队列机制的主要数据结构v消息队列的主要功能消息队列的主要功能42第42页,共92页,编辑于2022年,星期一6.3.1概述概述 v任务间的通信方式任务间的通信方式直接通信直接通信。在通信过程中双方必须明确地知道(命名)。在通信过程中双方必须明确地知道(命名)彼此:彼此:vSend(P,message)发送一个消息到任务发送一个消息到任务PvReceive(Q,message)从任务从任务Q接收一个消息接收一个消息间接通信间接通信。通信双方不需要指出消息的来源或去向,而。通信双方不需要指出消息的来源或去向,而通过中间机制来通信。如:通过中间机制来通信。如:vsend(A,message)发送一个消息给邮箱发送一个消息给邮箱Avreceive(A,message)从邮箱从邮箱A接收一个消息接收一个消息43第43页,共92页,编辑于2022年,星期一概述概述 v消息队列消息队列:属于间接通信方式:属于间接通信方式v消息消息:内存空间中一段长度可变的缓冲区,其长度:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空。数据、数据块的指针或空。v对消息内容的解释由应用完成。对消息内容的解释由应用完成。从从操作系统操作系统观点看,消息没有定义的格式,所有的消息观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。都是字节流,没有特定的含义。从从应用应用观点看,根据应用定义的消息格式,消息被解释观点看,根据应用定义的消息格式,消息被解释成特定的含义。成特定的含义。应用可以只把消息当成一个标志,这时消息机制用于应用可以只把消息当成一个标志,这时消息机制用于实现实现同步。同步。44第44页,共92页,编辑于2022年,星期一概述概述 v一些操作系统内核把消息进一步分为:邮箱和一些操作系统内核把消息进一步分为:邮箱和消息队列消息队列邮箱邮箱仅能存放单条消息,它提供了一种低开销的机制来仅能存放单条消息,它提供了一种低开销的机制来传送信息。每个邮箱可以保存一条大小为若干个字节的传送信息。每个邮箱可以保存一条大小为若干个字节的消息。消息。消息队列消息队列可存放若干消息,提供了一种任务间缓冲通可存放若干消息,提供了一种任务间缓冲通信的方法。信的方法。v消息机制可支持消息机制可支持定长定长与与可变长度可变长度两种模式的消息,两种模式的消息,可变长度的消息队列需要对队列中的每一条消可变长度的消息队列需要对队列中的每一条消息增加额外的存储开销。息增加额外的存储开销。45第45页,共92页,编辑于2022年,星期一6.3.2消息队列机制的主要数据结构消息队列机制的主要数据结构 v消息队列控制块消息队列控制块管理所有创建的消息队列,系统运行时动态分配和回收管理所有创建的消息队列,系统运行时动态分配和回收消息队列控制块消息队列控制块v消息队列缓冲区消息队列缓冲区存放发送到该队列的消息,接收者从缓冲区中取出消息。存放发送到该队列的消息,接收者从缓冲区中取出消息。消息的发送或接收有两种方法(影响消息缓冲区结构):消息的发送或接收有两种方法(影响消息缓冲区结构):v将数据从发送任务的空间完全拷贝到接收任务的空间中将数据从发送任务的空间完全拷贝到接收任务的空间中(效率较低,执行时间与消息大小有关)(效率较低,执行时间与消息大小有关)v只传递指向数据存储空间的指针(提高系统性能)只传递指向数据存储空间的指针(提高系统性能)46第46页,共92页,编辑于2022年,星期一消息队列机制的主要数据结构消息队列机制的主要数据结构 47第47页,共92页,编辑于2022年,星期一消息队列机制的主要数据结构消息队列机制的主要数据结构 消息队列的环形缓冲消息队列的环形缓冲消息队列的环形缓冲消息队列的环形缓冲 48第48页,共92页,编辑于2022年,星期一6.3.3消息队列的主要功能消息队列的主要功能 v创建消息队列创建消息队列v发送普通消息发送普通消息v发送紧急消息发送紧急消息v发送广播消息发送广播消息v接收消息接收消息v删除消息队列删除消息队列v获取有关消息队列的各种信息获取有关消息队列的各种信息49第49页,共92页,编辑于2022年,星期一消息队列的主要功能消息队列的主要功能 v随着任务(或随着任务(或ISR)不断地向(从)消)不断地向(从)消息队列发送(接收)消息,消息队列息队列发送(接收)消息,消息队列的状态不断转换,可以有如下几种状的状态不断转换,可以有如下几种状态:态:消息队列为空消息队列为空消息队列为空且有任务等待接收消息消息队列为空且有任务等待接收消息消息队列中有消息,但未满消息队列中有消息,但未满消息队列满消息队列满消息队列满,且有任务等待向它发送消消息队列满,且有任务等待向它发送消息息 50第50页,共92页,编辑于2022年,星期一1.创建消息队列创建消息队列 v创建消息队列时,调用者可以指定如创建消息队列时,调用者可以指定如下参数:下参数:消息的最大长度消息的最大长度每个消息队列中最多的消息数每个消息队列中最多的消息数消息队列的属性消息队列的属性v任务等待消息时的排队方式:任务等待消息时的排队方式:FIFO或或PRIORITYv系统为新创建的消息队列分配唯一的系统为新创建的消息队列分配唯一的ID51第51页,共92页,编辑于2022年,星期一2.发送消息发送消息 v根据紧急程度的不同,消息通常可分为根据紧急程度的不同,消息通常可分为普通消息普通消息与与紧急消息紧急消息。如果有任务正在等待消息(即消息队列为空),则普如果有任务正在等待消息(即消息队列为空),则普通消息发送和紧急消息发送的执行效果是一样的。通消息发送和紧急消息发送的执行效果是一样的。任任务从等待队列移到就绪队列中,消息被拷贝到任务提供务从等待队列移到就绪队列中,消息被拷贝到任务提供的缓冲区中(或者由接收任务得到指向消息的指针)的缓冲区中(或者由接收任务得到指向消息的指针)。如果没有任务等待,发送普通消息将消息放在队列尾,如果没有任务等待,发送普通消息将消息放在队列尾,而发送紧急消息将消息放在队列头。而发送紧急消息将消息放在队列头。52第52页,共92页,编辑于2022年,星期一发送消息发送消息 v如果发送消息时如果发送消息时队列已被填满队列已被填满,则不同的操作,则不同的操作系统可能采取不同的处理办法:系统可能采取不同的处理办法:挂起试图向已满的消息队列中发送消息的任务挂起试图向已满的消息队列中发送消息的任务(不适用于中断服务程序)(不适用于中断服务程序)简单地丢弃该条消息并向调用者返回错误信息简单地丢弃该条消息并向调用者返回错误信息v广播消息广播消息。在此之前所有试图从队列中接收消。在此之前所有试图从队列中接收消息的任务此时都将获得相同的消息。该功能拷息的任务此时都将获得相同的消息。该功能拷贝消息到各任务的消息缓冲中(或者让所有的贝消息到各任务的消息缓冲中(或者让所有的等待任务得到指向消息的指针),并唤醒所有等待任务得到指向消息的指针),并唤醒所有的等待任务。的等待任务。53第53页,共92页,编辑于2022年,星期一3.接收消息接收消息v如果指定的消息队列中有消息,则将其中的第一条如果指定的消息队列中有消息,则将其中的第一条消息拷贝到调用者的缓冲区(或者将第一条消息指消息拷贝到调用者的缓冲区(或者将第一条消息指针传递给调用者),并从消息队列中删除它。针传递给调用者),并从消息队列中删除它。v如果此时消息队列中没有消息,则可能出现以下如果此时消息队列中没有消息,则可能出现以下几种情况:几种情况:永远等待消息的到达永远等待消息的到达:等待消息的任务按:等待消息的任务按FIFO或优先或优先级高低顺序排列在等待队列中级高低顺序排列在等待队列中等待消息且指定等待时限等待消息且指定等待时限:等待消息的任务按:等待消息的任务按FIFO或或优先级高低顺序排列在等待队列中优先级高低顺序排列在等待队列中不等待,强制立即返回不等待,强制立即返回54第54页,共92页,编辑于2022年,星期一接收消息接收消息v限时等待可有效预防死锁限时等待可有效预防死锁v中断服务程序接收消息时必须选择不中断服务程序接收消息时必须选择不等待,因为中断服务程序是不能被阻等待,因为中断服务程序是不能被阻塞的。塞的。v如果消息队列被应用删除,则所有等如果消息队列被应用删除,则所有等待该消息队列的任务都被返回一个错待该消息队列的任务都被返回一个错误信息,并回复到就绪状态。误信息,并回复到就绪状态。55第55页,共92页,编辑于2022年,星期一4.删除消息队列删除消息队列 v从系统中删除指定的消息队列,释放从系统中删除指定的消息队列,释放消息队列控制块消息队列控制块及及消息队列缓冲区消息队列缓冲区。v任何知道此消息队列任何知道此消息队列ID号的代码都可号的代码都可以删除它。以删除它。v消息队列被删除后,所有等待从这个消息队列被删除后,所有等待从这个消息队列接收消息的任务都回到消息队列接收消息的任务都回到就绪就绪态态,并得到一个错误信息表明消息队,并得到一个错误信息表明消息队列已被删除。列已被删除。56第56页,共92页,编辑于2022年,星期一6.4事事件件 v概述概述v事件机制的主要数据结构事件机制的主要数据结构v事件的主要功能事件的主要功能57第57页,共92页,编辑于2022年,星期一6.4.1概述概述 v在嵌入式实时内核中,事件是指一种表明预先定义的系统事在嵌入式实时内核中,事件是指一种表明预先定义的系统事件已经发生的机制。件已经发生的机制。v事件机制用于任务与任务之间、任务与事件机制用于任务与任务之间、任务与ISR之间的同步。之间的同步。其主要的特点是可实现其主要的特点是可实现一对多的同步一对多的同步。v一个事件就是一个标志,不具备其它信息。一个事件就是一个标志,不具备其它信息。v一个或多个事件构成一个事件集。事件集可以用一个指定一个或多个事件构成一个事件集。事件集可以用一个指定长度的变量(比如一个长度的变量(比如一个32位的无符号整型变量,不同的操位的无符号整型变量,不同的操作系统其具体实现不一样)来表示,而每个事件由在事件作系统其具体实现不一样)来表示,而每个事件由在事件集变量中的某一位来代表。集变量中的某一位来代表。58第58页,共92页,编辑于2022年,星期一概述概述 v事件及事件集有以下特点:事件及事件集有以下特点:事件间事件间相互独立相互独立事件事件仅用于同步仅用于同步,不提供数据传输功能,不提供数据传输功能事件无队列,即多次发送同一事件,在未经过任何处理的情况事件无队列,即多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。下,其效果等同于只发送一次。v提供事件机制的意义在于:提供事件机制的意义在于:当某任务要与多个任务或中断服务同步时,就需要使用事件机制当某任务要与多个任务或中断服务同步时,就需要使用事件机制。若任务需要与一组事件中的任意一个发生同步,可称为若任务需要与一组事件中的任意一个发生同步,可称为独立型独立型同步同步(逻辑(逻辑“或或”关系)。关系)。任务也可以等待若干事件都发生时才同步,称为任务也可以等待若干事件都发生时才同步,称为关联型同步关联型同步(逻辑(逻辑“与与”关系)。关系)。59第59页,共92页,编辑于2022年,星期一概述概述“或或或或”同步和同步和同步和同步和“与与与与”同步同步同步同步 60第60页,共92页,编辑于2022年,星期一概述概述 用多个事件的组合发信号给多个任务用多个事件的组合发信号给多个任务用多个事件的组合发信号给多个任务用多个事件的组合发信号给多个任务 61第61页,共92页,编辑于2022年,星期一概述概述 v术语:术语:发送事件集发送事件集。指在一次发送过程中发往接收者(比如。指在一次发送过程中发往接收者(比如任务)的一个或多个事件的组合。任务)的一个或多个事件的组合。待处理事件集待处理事件集。指已被发送到一个接收者但还没有。指已被发送到一个接收者但还没有被接收(即正在等待处理)的所有事件的集合。被接收(即正在等待处理)的所有事件的集合。事件条件事件条件。指事件接收者在一次接收过程中期待接收。指事件接收者在一次接收过程中期待接收的一个或多个事件的集合。的一个或多个事件的集合。v“或或”同步:待处理事件集只要包括事件条件中的任一事件同步:待处理事件集只要包括事件条件中的任一事件即可满足要求;即可满足要求;v“与与”同步:待处理事件集必须包括事件条件中的全部事件方同步:待处理事件集必须包括事件条件中的全部事件方可满足要求。可满足要求。62第62页,共92页,编辑于2022年,星期一6.4.2事件机制的主要数据结构事件机制的主要数据结构 v事件集控制块:管理所有事件集控制块:管理所有创建创建的事件的事件集集或者或者v事件集附属于任务,事件集附属于任务,不需创建不需创建,其相,其相关参数成为任务控制块的一部分关参数成为任务控制块的一部分 63第63页,共92页,编辑于2022年,星期一事件的内部实现机制实例说明事件的内部实现机制实例说明C/OS-II v事件标志组数据结构事件标志组数据结构typedefstructINT8UOSFlag