您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 嵌入式系统-Chapter6-同步、互斥与通信
电子科技大学嵌入式软件工程中心嵌入式系统及应用电子科技大学嵌入式软件工程中心第六章同步、互斥与通信电子科技大学嵌入式软件工程中心主要内容•概述•信号量•邮箱和消息队列•事件•异步信号*•管道*电子科技大学嵌入式软件工程中心概述•多任务系统中任务之间的关系–相互独立仅竞争CPU资源–竞争除CPU外的其他资源(互斥)–同步协调彼此运行的步调,保证协同运行的各个任务具有正确的执行次序–通信彼此间传递数据或信息,以协同完成某项工作电子科技大学嵌入式软件工程中心•任务能以以下方式与中断处理程序或其他任务进行同步或通信:–单向同步或通信:一个任务与另一个任务或一个ISR同步或通信。–双向同步或通信:两个任务相互同步或通信。双向同步不能在任务与ISR之间进行,因为ISR不能等待。概述电子科技大学嵌入式软件工程中心ISRxTaskyPOSTPEND任务与ISR之间的同步(单向)TaskxTaskyPOSTPENDPOSTPEND任务与任务之间的同步(双向)任务与任务之间的同步(单向)TaskxTaskyPOSTPEND电子科技大学嵌入式软件工程中心•在嵌入式多任务系统中,任务间的耦合程度是不一样的:–耦合程度较高:任务之间需要进行大量的通信,相应的系统开销较大;–耦合程度较低:任务之间不存在通信需求,其间的同步关系很弱甚至不需要同步或互斥,系统开销较小。•研究任务间耦合程度的高低对于合理地设计应用系统、划分任务有很重要的作用。概述电子科技大学嵌入式软件工程中心•在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:–信号量(semaphore),用于互斥与同步–事件(组)(eventgroup),用于同步–异步信号(asynchronoussignal),用于同步–邮箱(mailbox)、消息队列(messagequeue),用于消息通信–管道(pipe),提供非结构化数据交换和实现同步概述电子科技大学嵌入式软件工程中心•以下一些机制也可用于同步与通信(在单处理器或多处理器系统中):–全局变量–共享内存–Sockets–远程过程调用(RemoteProcedureCall)概述电子科技大学嵌入式软件工程中心第一节信号量信号量的种类及用途互斥信号量二值信号量计数信号量信号量机制的主要数据结构典型的信号量操作电子科技大学嵌入式软件工程中心•信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。•信号量一般分为三种:信号量的种类及用途用于解决互斥问题。它比较特殊,可能会引起优先级反转问题。用于解决同步问题用于解决资源计数问题将信号量进行种类细分,可以根据其用途,在具体实现时做专门处理,提高执行效率和可靠性。电子科技大学嵌入式软件工程中心•用互斥信号量保护的代码区称作“临界区”,临界区代码通常用于对共享资源的访问。•互斥信号量的值被初始化成1,表明目前没有任务进入“临界区”,但最多只有一个任务可以进入“临界区”。•第一个试图进入“临界区”的任务将成功获得互斥信号量,而随后试图进入用同一信号量保护的临界区的所有其他任务就必须等待。•当任务离开“临界区”时,它将释放信号量并允许正在等待该信号量的任务进入“临界区”。互斥信号量Task1Task2共享资源电子科技大学嵌入式软件工程中心互斥信号量•共享资源可能是一段存储器空间、一个数据结构或I/O设备,也可能是被两个或多个并发任务共享的任何内容。•使用互斥信号量可以实现对共享资源的串行访问,保证只有成功地获取互斥信号量的任务才能够释放它。•互斥信号量是一种特殊的二值信号量,一般它支持所有权、递归访问、任务删除安全和一些避免优先级反转、饥饿、死锁等互斥所固有问题的协议。电子科技大学嵌入式软件工程中心互斥信号量状态图互斥信号量状态图开启锁定初始化值为1申请并获得值为0释放值为1申请(递归)并获得锁定数加1释放(递归)锁定数减1电子科技大学嵌入式软件工程中心互斥信号量•所有权:当一个任务通过获取互斥信号量而将其锁定时,得到该互斥信号量的所有权。相反,当一个任务释放信号量时,失去对其的所有权。•当一个任务拥有互斥信号量时,其他的任务不能再锁定或释放它,即任务要释放互斥信号量,必须事前先获取该信号量。电子科技大学嵌入式软件工程中心Task1RoutineARoutineB互斥信号量•嵌套(递归)资源访问–如果Task1调用RoutineA,而RoutineA又调用RoutineB,并且三者访问相同的共享资源,就发生了递归共享资源的访问同步问题。共享资源一个递归的互斥信号量允许嵌套锁定互斥信号量,而不引起死锁。电子科技大学嵌入式软件工程中心互斥信号量•嵌套(递归)资源访问–每个获取信号量的调用必须与释放信号量的调用相匹配。当最外层的获取信号量的调用与释放信号量的调用匹配时,该信号量才允许被其它任务访问。–用于同步的信号量不支持嵌套访问,任务如果对同步信号量使用上述操作是错误的,任务会被永久阻塞,并且阻塞条件永远不会解除。电子科技大学嵌入式软件工程中心互斥信号量•删除安全:–在一个受信号量保护的临界区,经常需要保护在临界区执行的任务不会被意外地删除。–删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,可能导致资源处于破坏状态,也就导致了其它所有要访问该资源的任务无法得到满足。电子科技大学嵌入式软件工程中心互斥信号量•删除安全:–为避免任务在临界区执行时不被意外删除:•提供“任务保护”和“解除任务保护”原语对•同时,为互斥信号量提供“删除安全”选项。在创建信号量的时候使用这个选项,当应用每次获取信号量时隐含地使能“任务保护”功能,当每次释放信号量时隐含地使用“解除任务保护”功能。电子科技大学嵌入式软件工程中心二值信号量•二值信号量主要用于任务与任务之间、任务与中断服务程序之间的同步–用于同步的二值信号量初始值为0,表示同步事件尚未产生;–任务申请信号量以等待该同步事件的发生;–另一个任务或ISR到达同步点时,释放信号量(将其值设置为1)表示同步事件已发生,以唤醒等待的任务。Task1Task2二值信号量初值为0电子科技大学嵌入式软件工程中心二值信号量二值信号量状态图可获得不可获得申请并获得(值为0)释放(值为1)初始化值为0电子科技大学嵌入式软件工程中心Task1(){……执行一些操作;将信号量sem1置1;申请信号量sem2;…………}Task2(){……申请信号量sem1;执行一些操作;将信号量sem2置1;…………}Task2申请信号量sem1失败,系统切换到Task1sem1被置1后,Task2得到sem1并抢占Task1Task2运行到某处时因某种原因被阻塞,系统切换到Task1用二值信号量实现两个任务之间的双向同步•Task2优先级高于Task1•sem1和sem2的初始值均为0电子科技大学嵌入式软件工程中心计数信号量计数信号量用于控制系统中共享资源的多个实例的使用,允许多个任务同时访问同一种资源的多个实例计数信号量被初始化为n(非负整数),n为该种共享资源的数目。Task1Task2共享资源实例nTaskm共享资源实例1…………电子科技大学嵌入式软件工程中心计数信号量计数信号量状态图可获得不可获得初始化值大于0申请并获得值为0释放值为1申请并获得值减1释放值加1电子科技大学嵌入式软件工程中心信号量机制的主要数据结构SCB1SCB2…………信号量控制块count信号量名字或IDTask1Task2……任务等待列表电子科技大学嵌入式软件工程中心信号量机制的主要数据结构•信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块•互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue任务等待队列attributes信号量属性lock_nesting_behavior试图嵌套获得时的规则wait_discipline任务等待信号量的方式priority_ceiling优先级天花板值lock是否被占有holder拥有者nest_count嵌套层数电子科技大学嵌入式软件工程中心•计数信号量控制结构Counting_Semaphore_Control_Blockwait_queue任务等待队列attributes计数信号量属性maximum_count最大计数值wait_discipline任务等待信号量的方式count当前计数值信号量机制的主要数据结构电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•事件控制块ECB-同步与通信机制的基本数据结构typedefstruct{INT8UOSEventType;//事件类型INT8UOSEventGrp;//等待任务所在的组INT16UOSEventCnt;//计数器(信号量)void*OSEventPtr;//指向消息或消息队列的指针INT8UOSEventTbl[OS_EVENT_TBL_SIZE];//等待任务列表}OS_EVENT;电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•当一个事件发生后,等待事件列表中优先级最高的任务(即在.OSEventTbl[]&OSEventGrp中所有被置1的位中优先级数值最小的任务)得到该事件。电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•当.OSEventTbl[n]中的任何一位为1时,OSEventGrp中的第n位为1。与任务就绪列表类似!电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•将一个任务插入到等待事件的任务列表中:pevent-OSEventGrp|=OSMapTbl[prio3];pevent-OSEventTbl[prio3]|=OSMapTbl[prio&0x07];与将一个任务插入到就绪列表中的操作类似!IndexBitmask(Binary)000000001100000010200000100300001000400010000500100000601000000710000000电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•从等待事件的任务列表中使任务脱离等待状态if((pevent-OSEventTbl[prio3]&=~OSMapTbl[prio&0x07])==0){pevent-OSEventGrp&=~OSMapTbl[prio3];}与将任务从就绪列表中清除的操作类似!电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•在等待事件的任务列表中查找优先级最高的任务y=OSUnMapTbl[pevent-OSEventGrp];x=OSUnMapTbl[pevent-OSEventTbl[y]];prio=(y3)+x;与查找优先级最高的就绪任务的操作类似!电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明-µC/OS-II•空闲事件控制块链表电子科技大学嵌入式软件工程中心典型的信号量操作•创建信号量•获取(申请)信号量•释放信号量•删除信号量•清除信号量的任务等待列表•获取有关信号量的各种信息电子科技大学嵌入式软件工程中心创建信号量•功能:根据应用传递的参数创建一个信号量•参数:信号量的名字、属性和初始值等。•内核动作:–从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。–创建成功时,为其分配唯一的ID号返回给应用。–如果已创建信号量数量已达到用户配置的最大数量,就返回错误。电子科技大学嵌入式软件工程中心创建信号量信号量的属性包括:•类型•任务等待信号量的方式(即排列的顺序)•与任务删除安全、递归访问以及解决优先级反转的策略相关的参数(只针对互斥信号量)。电子科技大学嵌入式软件工程中心创建信号量信号量的属性信号量的类型互斥信号量(MUTEX_SEMAPHORE)计数信号量(COUNTING_SEMAPHORE)二值信号量(BINAR
本文标题:嵌入式系统-Chapter6-同步、互斥与通信
链接地址:https://www.777doc.com/doc-316122 .html