同步互斥与 通信精品文稿.ppt
《同步互斥与 通信精品文稿.ppt》由会员分享,可在线阅读,更多相关《同步互斥与 通信精品文稿.ppt(100页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、同步互斥与 通信第1页,本讲稿共100页2023/2/2主要内容信号量邮箱和消息队列事件异步信号*第2页,本讲稿共100页2023/2/3概述多任务系统中任务之间的关系相互独立 仅竞争CPU资源竞争除CPU外的其他资源(互斥)同步 协调彼此运行的步调通信 彼此间传递数据或信息,以协同完成某项工作第3页,本讲稿共100页2023/2/4任务能以以下方式与中断处理程序或其他任务进行同步或通信:单向同步或通信:一个任务与另一个任务或一个ISR同步或通信。双向同步或通信:两个任务相互同步或通信。双向同步不能在任务与ISR之间进行,因为ISR不能等待。概述第4页,本讲稿共100页2023/2/5Task
2、xTaskyPOSTPENDISRxTaskyPOSTPENDTaskxTaskyPOSTPENDPOSTPEND任务与任务之间的同步(单向)任务与任务之间的同步(单向)任务与任务之间的同步(单向)任务与任务之间的同步(单向)任务与任务与任务与任务与ISRISR之间的同步(单向)之间的同步(单向)之间的同步(单向)之间的同步(单向)任务与任务之间的同步(双向)任务与任务之间的同步(双向)任务与任务之间的同步(双向)任务与任务之间的同步(双向)第5页,本讲稿共100页2023/2/6在嵌入式多任务系统中,任务间的耦合程度是不一样的:耦合程度较高:任务之间需要进行大量的通信,相应的系统开销较大;耦
3、合程度较低:任务之间不存在通信需求,其间的同步关系很弱甚至不需要同步或互斥,系统开销较小。研究任务间耦合程度的高低对于合理地设计应用系统、划分任务有很重要的作用。概述第6页,本讲稿共100页2023/2/7在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号量(semaphore),用于互斥与同步事件(组)(event group),用于同步异步信号(asynchronous signal),用于同步邮箱(mailbox)、消息队列(message queue)或管道(pipe),用于消息通信概述第7页,本讲稿共100页2023/2/8以下一些机制也可用于同步与通信(在
4、单处理器或多处理器系统中):全局变量共享内存Sockets远程过程调用(Remote Procedure Call)概述第8页,本讲稿共100页2023/2/91.信号量信号量的种类及用途互斥信号量二值信号量计数信号量信号量机制的主要数据结构信号量的主要功能第9页,本讲稿共100页2023/2/10信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。信号量一般分为三种:用于解决互斥问题的互斥信号量。它比较特殊,可能会引起优先级反转问题。用于解决同步问题的二值信号量。用于解决资源计数问题的计数信号量。将信号量进行种类细分,可以根据其用途,在具体实现时做专门处理,提高执行效率和可靠性
5、。信号量的种类及用途第10页,本讲稿共100页2023/2/11用互斥信号量保护的代码区称作“临界区”,临界区代码通常用于对共享资源的访问。互斥信号量的值被初始化成1,表明目前没有任务进入“临界区”,但最多只有一个任务可以进入“临界区”。第一个试图进入“临界区”的任务将成功获得互斥信号量,而随后试图进入用同一信号量保护的临界区的所有其他任务就必须等待。当任务离开“临界区”时,它将释放信号量并允许正在等待该信号量的任务进入“临界区”。互斥信号量Task1Task2共享资源共享资源第11页,本讲稿共100页2023/2/13二值信号量二值信号量主要用于任务与任务之间、任务与中断服务程序之间的同步用
6、于同步的二值信号量初始值为0,表示同步事件尚未产生;任务申请信号量以等待该同步事件的发生;另一个任务或ISR到达同步点时,释放信号量(将其值设置为1)表示同步事件已发生,以唤醒等待的任务。第13页,本讲稿共100页2023/2/14二值信号量availableunavailableacquire(value=0)release(value=1)Initialvalue=0二值信号量状态图二值信号量状态图第14页,本讲稿共100页2023/2/15Task1()执行一些操作执行一些操作;将信号量将信号量sem1置置1;申请信号量申请信号量sem2;Task2()申请信号量申请信号量sem1;执行
7、一些操作执行一些操作;将信号量将信号量sem2置置1;Task2申申 请请 信信 号号 量量sem1失失败败,系系统统切切换到换到Task1sem1被被 置置1后后,Task2得到得到sem1并抢占并抢占Task1Task2运运行行到到某某处处时时因因某某种种原原因因被被阻阻塞塞,系系统切换到统切换到Task1用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步 Task2Task2优先级高于优先级高于优先级高于优先级高于Task1Task1 sem1sem1和和和和sem2sem2的初始值均为
8、的初始值均为的初始值均为的初始值均为0 0第15页,本讲稿共100页2023/2/16计数信号量计数信号量用于控制系统中共享资源的多个计数信号量用于控制系统中共享资源的多个实例的使用,允许多个任务同时访问同一种实例的使用,允许多个任务同时访问同一种资源的多个实例资源的多个实例计数信号量被初始化为计数信号量被初始化为n(非负整数),(非负整数),n为为该种共享资源的数目。该种共享资源的数目。Task1Task2共享资源实例共享资源实例nTaskm共享资源实例共享资源实例1第16页,本讲稿共100页2023/2/17计数信号量availableunavailableInitialcount0acq
9、uire(count=0)release(count=1)Initialcount=0计数信号量状态图计数信号量状态图acquire(count=count-1)release(count=count+1)第17页,本讲稿共100页2023/2/20信号量机制的主要数据结构信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue任务等待队列任务等待队列attributes信号量属性信号量属性wait_discipline任务等待信号量的方式任务等待信号量的方式pri
10、ority_ceiling优先级天花板值优先级天花板值lock是否被占有是否被占有holder拥有者拥有者 count当前计数值当前计数值第20页,本讲稿共100页2023/2/21信号量内部实现机制实例说明C/OS-II事件控制块ECB同步与通信机制的基本数据结构typedef structINT8UOSEventType;/事件类型INT8UOSEventGrp;/等待任务所在的组INT16UOSEventCnt;/计数器(信号量)void*OSEventPtr;/指向消息或消息队列的指针INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任务列表OS_EVENT;第2
11、1页,本讲稿共100页2023/2/22信号量内部实现机制实例说明C/OS-II当一个事件发生后,等待事件列表中优先级最高的任务(即在.OSEventTbl&OSEventGrp中所有被置1的位中优先级数值最小的任务)得到该事件。第22页,本讲稿共100页2023/2/23信号量内部实现机制实例说明C/OS-II当.OSEventTbln中的任何一位为1时,OSEventGrp中的第n位为1。与任务就绪列表类似!第23页,本讲稿共100页2023/2/24信号量内部实现机制实例说明C/OS-II将一个任务插入到等待事件的任务列表中:pevent-OSEventGrp|=OSMapTblprio
12、 3;pevent-OSEventTblprio 3|=OSMapTblprio&0 x07;与将一个任务插入到就绪列表中的操作类似!IndexBitmask(Binary)0 000000011 000000102 000001003 000010004 000100005 001000006 010000007 10000000第24页,本讲稿共100页2023/2/25信号量内部实现机制实例说明C/OS-II从等待事件的任务列表中使任务脱离等待状态if(pevent-OSEventTblprio 3&=OSMapTblprio&0 x07)=0)pevent-OSEventGrp&=OS
13、MapTblprio 3;与将任务从就绪列表中清除的操作类似!第25页,本讲稿共100页2023/2/26信号量内部实现机制实例说明C/OS-II在等待事件的任务列表中查找优先级最高的任务y=OSUnMapTblpevent-OSEventGrp;x=OSUnMapTblpevent-OSEventTbly;prio=(y OSEventPtr;if(pevent!=(OS_EVENT*)0)/初始化ECB的各个域pevent-OSEventType=OS_EVENT_TYPE_SEM;/事件类型为信号量pevent-OSEventCnt=cnt;/信号量的初始计数值pevent-OSEven
14、tPtr=(void*)0;OS_EventWaitListInit(pevent);/初始化等待任务列表return(pevent);/调用者需检查返回值,如果为NULL则表示建立失败第32页,本讲稿共100页2023/2/33获取(申请)信号量功能:试图获得应用指定的信号量。if 信号量的值大于0then 将信号量的值减1else 根据接收信号量的选项,将任务放到等待队列中,或是直接返回第33页,本讲稿共100页2023/2/34获取(申请)信号量当所申请的信号量不能被立即获得时,可以有以下几种选择:永远等待 不等待,立即返回,并返回一个错误状态码指定等待时限(可有效避免死锁)注意:不允许
15、在ISR中选择等待当任务选择等待时,将被按FIFO或优先级顺序放置在等待队列中第34页,本讲稿共100页2023/2/35获取(申请)信号量如果任务等待一个使用优先级继承算法的互斥信号量,且它的优先级高于当前正占有此信号量的任务的优先级,那么占有信号量的任务将继承这个被阻塞的任务的优先级。如果任务成功地获得一个采用优先级天花板算法的互斥信号量,它的优先级又低于优先级天花板,那么它的优先级将被抬升至天花板。第35页,本讲稿共100页2023/2/36获取(等待)一个信号量OSSemPend()void OSSemPend(OS_EVENT*pevent,INT16U timeout,INT8U*
16、err)if(pevent-OSEventCnt 0)/信号量值大于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)/判断任务恢复执行的原因,如果等待时限超时但仍然未
17、获得信号量,则返回超时信息OSEventTO(pevent);*err=OS_TIMEOUT;return;OSTCBCur-OSTCBEventPtr=(OS_EVENT*)0;*err=OS_NO_ERR;/任务由于获得信号量而恢复执行,本调用成功返回第36页,本讲稿共100页2023/2/37获取(无等待地请求)一个信号量OSSemAccept()INT16U OSSemAccept(OS_EVENT*pevent)INT16U cnt;cnt=pevent-OSEventCnt;if(cnt 0)pevent-OSEventCnt-;return(cnt);注意:即使不能成功获得信号量
18、(返回值为注意:即使不能成功获得信号量(返回值为0),),调用者也不会被阻塞。此函数可以在中断处理程序中调用者也不会被阻塞。此函数可以在中断处理程序中使用。使用。第37页,本讲稿共100页2023/2/38释放信号量功能:释放一个应用指定的信号量。if 没有任务等待这个信号量then 信号量的值加1 else 将信号量分配给一个等待任务(将相应的任务移出等待队列,使其就绪)如果使用了优先级继承或优先级天花板算法,那么执行该功能(系统调用)的任务的优先级将恢复到原来的高度。第38页,本讲稿共100页2023/2/39释放一个信号量OSSemPost()INT8U OSSemPost(OS_EVE
19、NT*pevent)if(pevent-OSEventGrp!=0 x00)/如果有任务在等待该信号量OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/使等待任务列表中优先级最高的任务就绪OS_Sched();/内核实施任务调度return(OS_NO_ERR);/成功返回 if(pevent-OSEventCnt OSEventCnt+;/信号量的值加1return(OS_NO_ERR);/成功返回 return(OS_SEM_OVF);/信号量溢出第39页,本讲稿共100页2023/2/40删除信号量功能:从系统中删除应用指定的一个信号量内核动作:
20、将信号量控制块返还给系统删除信号量的不一定是创建信号量的任务如果有任务正在等待获得该信号量,执行此功能将使所有等待这个信号量的任务回到就绪队列中,且返回一个状态码指示该信号量已被删除第40页,本讲稿共100页2023/2/41删除一个信号量OSSemDel()OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8U opt,INT8U*err)BOOLEAN tasks_waiting;if(pevent-OSEventGrp!=0 x00/根据是否有任务在等待信号量设置等待标志tasks_waiting=TRUE;elsetasks_waiting=FALSE;swit
21、ch(opt)case OS_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);第41页,本讲稿共100页202
22、3/2/42删除一个信号量OSSemDel()case OS_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)O
23、S_Sched();*err=OS_NO_ERR;return(OS_EVENT*)0);default:*err=OS_ERR_INVALID_OPT;return(pevent);第42页,本讲稿共100页2023/2/432.邮箱和消息队列概述消息队列机制的主要数据结构消息队列的主要功能第43页,本讲稿共100页2023/2/44任务间的通信方式直接通信。在通信过程中双方必须明确地知道(命名)彼此:wSend(P,message)发送一个消息到任务PwReceive(Q,message)从任务Q接收一个消息 间接通信。通信双方不需要指出消息的来源或去向,而通过中间机制来通信。如:wsen
24、d(A,message)发送一个消息给邮箱Awreceive(A,message)从邮箱A接收一个消息概述第44页,本讲稿共100页2023/2/45消息队列:属于间接通信方式消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空。对消息内容的解释由应用完成。从操作系统观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。从应用观点看,根据应用定义的消息格式,消息被解释成特定的含义。应用可以只把消息当成一个标志,这时消息机制用于实现同步概述第45页,本讲稿共100页2023/2/46一些操作系统内核把消息进一步分为:邮箱和消息队
25、列邮箱仅能存放单条消息,它提供了一种低开销的机制来传送信息。每个邮箱可以保存一条大小为若干个字节的消息。消息队列可存放若干消息,提供了一种任务间缓冲通信的方法。消息机制可支持定长与可变长度两种模式的消息,可变长度的消息队列需要对队列中的每一条消息增加额外的存储开销。概述第46页,本讲稿共100页2023/2/47消息队列机制的主要数据结构消息队列控制块管理所有创建的消息队列,系统运行时动态分配和回收消息队列控制块消息队列缓冲区存放发送到该队列的消息,接收者从缓冲区中取出消息。消息的发送或接收有两种方法(影响消息缓冲区结构):w将数据从发送任务的空间完全拷贝到接收任务的空间中(效率较低,执行时间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 同步互斥与 通信精品文稿 同步 通信 精品 文稿
限制150内