05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt

上传人(卖家):晟晟文业 文档编号:5203414 上传时间:2023-02-17 格式:PPT 页数:126 大小:1.28MB
下载 相关 举报
05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt_第1页
第1页 / 共126页
05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt_第2页
第2页 / 共126页
05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt_第3页
第3页 / 共126页
05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt_第4页
第4页 / 共126页
05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt_第5页
第5页 / 共126页
点击查看更多>>
资源描述

1、电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第五章第五章 同步、互斥与通信同步、互斥与通信电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心主要内容主要内容1 概述概述2 信号量信号量3 邮箱和消息队列邮箱和消息队列4 事件事件5 异步信号异步信号6 管道管道电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第一节第一节概述概述电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q多任务系统中任务之间的关系多任务系统中任务之间的关系v相互独立相互独立:仅竞争:仅竞争CPU资源。资源。v竞争除竞争除CPU外的其他资源外的其他资源(互斥互斥)。v同步同步

2、:协调彼此运行的步调,保证协同运行:协调彼此运行的步调,保证协同运行的各个任务具有正确的执行次序。的各个任务具有正确的执行次序。v通信通信:彼此间传递数据或信息,以协同完成:彼此间传递数据或信息,以协同完成某项工作。某项工作。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q任务与中断处理程序或其他任务进行同任务与中断处理程序或其他任务进行同步或通信:步或通信:v单向同步或通信单向同步或通信:一个任务与另一个任务:一个任务与另一个任务或一个或一个ISR同步或通信。同步或通信。v双向同步或通信双向同步或通信:两个任务相互同步或通:两个任务相互同步或通信。信。双向同步不能在任务与双向同

3、步不能在任务与ISR之间进行,因为之间进行,因为ISR不能等待不能等待。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心ISR xTask yPOSTPENDTask xTask yPOSTPENDPOSTPENDTask xTask yPOSTPEND电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q任务间的任务间的耦合程度耦合程度:v耦合程度较高耦合程度较高 任务之间需要进行大量的通信,相应的系统开任务之间需要进行大量的通信,相应的系统开销较大;销较大;v耦合程度较低耦合程度较低 任务之间不存在通信需求,其间的同步关系很任务之间不存在通信需求,其间的同步关系很弱甚至

4、不需要同步或互斥,系统开销较小。弱甚至不需要同步或互斥,系统开销较小。q研究任务间耦合程度的高低研究任务间耦合程度的高低对于合理地对于合理地设计应用系统、划分任务有很重要的作设计应用系统、划分任务有很重要的作用。用。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q在单处理器平台上,嵌入式操作系统内在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包核提供的同步、互斥与通信机制主要包括:括:v信号量信号量(semaphore),用于互斥与同步。,用于互斥与同步。v事件事件(组组)(event group),用于同步。,用于同步。v异步信号异步信号(asynchron

5、ous signal),用于同,用于同步。步。v邮箱邮箱(mailbox)、消息队列消息队列(message queue),用于消息通信。,用于消息通信。v管道管道(pipe),提供非结构化数据交换和实现,提供非结构化数据交换和实现同步。同步。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q以下一些机制也可用于同步与通信以下一些机制也可用于同步与通信(在在单处理器或多处理器系统中单处理器或多处理器系统中):v全局变量。全局变量。v共享内存。共享内存。vSockets。v远程过程调用远程过程调用(Remote Procedure Call)。电子科技大学嵌入式软件工程中心电子科技大

6、学嵌入式软件工程中心第二节第二节信号量信号量1 信号量的种类及用途2 互斥信号量3 二值信号量4 计数信号量5 信号量机制的主要数据结构6 典型的信号量操作电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q信号量用于实现任务与任务之间、任务信号量用于实现任务与任务之间、任务与中断处理程序之间的与中断处理程序之间的同步同步与与互斥互斥。q信号量一般分为三种:信号量一般分为三种:1 信号量的种类及用途信号量的种类及用途用于解决互斥问题。用于解决互斥问题。可能会引起优先可能会引起优先级反转问题。级反转问题。用于解决同步问题。用于解决同步问题。用于解决资源计数问题。用于解决资源计数问题。电

7、子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q用互斥信号量保护的代码区称作用互斥信号量保护的代码区称作“临界区临界区”。v临界区代码通常用于对临界区代码通常用于对共享资源共享资源的访问。的访问。v获得互斥信号量的任务进入获得互斥信号量的任务进入“临界区临界区”,其他试图,其他试图获取信号量的任务就会被阻塞。获取信号量的任务就会被阻塞。v当任务离开临界区时,就是释放信号量。当任务离开临界区时,就是释放信号量。q互斥信号量的值被初始化成互斥信号量的值被初始化成1,表明目前没有,表明目前没有任务进入任务进入“临界区临界区”,但最多只有一个任务可,但最多只有一个任务可以进入以进入“临界区

8、临界区”。2 互斥信号量互斥信号量Task1Task2共享资源共享资源电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心13INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio)OS_STK *psp;INT8U err;OS_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)/*Make sure task doesnt already exist at this priority */OSTCBPrioTblprio=(OS_TCB*)1;/

9、*Reserve the priority to prevent others from doing the same thing until task is created.*/OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initialize the tasks stack */err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();OSTaskCtr+;/*Increment the

10、#tasks counter */OS_EXIT_CRITICAL();if(OSRunning=TRUE)/*Find highest priority task if multitasking has started*/OS_Sched();else OS_ENTER_CRITICAL();OSTCBPrioTblprio=(OS_TCB*)0;/*Make this priority available to others */OS_EXIT_CRITICAL();return(err);OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);电子科技大学嵌入式

11、软件工程中心电子科技大学嵌入式软件工程中心q共享资源:共享资源:v一段存储器空间、一个数据结构或一段存储器空间、一个数据结构或I/O设备,也可能设备,也可能是被两个或多个并发任务共享的任何内容。是被两个或多个并发任务共享的任何内容。q使用互斥信号量可以实现使用互斥信号量可以实现对共享资源的串行访对共享资源的串行访问问。互斥信号量状态图互斥信号量状态图开启开启锁定锁定初始化初始化值为值为1申请并获得申请并获得值为值为0释放释放值为值为1申请申请(递归递归)并获得并获得锁定数加锁定数加1释放释放(递归递归)锁定数减锁定数减1电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q所有权所有权

12、v当一个任务通过当一个任务通过获取互斥信号量获取互斥信号量而将其锁定而将其锁定时,得到该互斥信号量的所有权。时,得到该互斥信号量的所有权。v当一个任务当一个任务释放信号量释放信号量时,失去对其的所有时,失去对其的所有权。权。v申请与释放要匹配申请与释放要匹配:任务要释放互斥信号量,:任务要释放互斥信号量,必须事前先获取该信号量。必须事前先获取该信号量。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心16INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio)OS_STK *psp;INT8U

13、 err;OS_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)/*Make sure task doesnt already exist at this priority */OSTCBPrioTblprio=(OS_TCB*)1;/*Reserve the priority to prevent others from doing the same thing until task is created.*/OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*I

14、nitialize the tasks stack */err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();OSTaskCtr+;/*Increment the#tasks counter */OS_EXIT_CRITICAL();if(OSRunning=TRUE)/*Find highest priority task if multitasking has started*/OS_Sched();else OS_ENTER_CRITICAL();OSTCBPrioT

15、blprio=(OS_TCB*)0;/*Make this priority available to others */OS_EXIT_CRITICAL();return(err);OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Task1RoutineARoutineBq嵌套资源访问嵌套资源访问v如果如果Task1调用调用RoutineA,而,而RoutineA又又调用调用RoutineB,并且三者访问相同的共享,并且三者访问相同的共享资源,就发生了递归共享资源的访问同步问资源,就发生了递归共享资

16、源的访问同步问题。题。共享资源共享资源 一个递归的互斥信一个递归的互斥信号量允许嵌套锁定号量允许嵌套锁定互斥信号量,而不互斥信号量,而不引起死锁。引起死锁。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心v每个获取信号量的调用必须与释放信号量的每个获取信号量的调用必须与释放信号量的调用相调用相匹配匹配。当当最外层最外层的获取信号量的调用与释放信号量的调的获取信号量的调用与释放信号量的调用匹配时,该信号量才允许被其它任务访问。用匹配时,该信号量才允许被其它任务访问。v用于用于同步的信号量同步的信号量不支持嵌套访问。不支持嵌套访问。q删除安全删除安全v需要保护在临界区执行的任务不会被意

17、外地需要保护在临界区执行的任务不会被意外地删除。删除。删除一个在临界区执行的任务删除一个在临界区执行的任务可能引起意想不到可能引起意想不到的后果,的后果,造成保护资源的信号量不可用造成保护资源的信号量不可用,可能导,可能导致资源处于破坏状态。致资源处于破坏状态。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心比较项目比较项目关中断关中断使用测试并置位使用测试并置位指令指令禁止任务禁止任务切换切换使用信号量使用信号量锁定范围锁定范围互斥力度最强互斥力度最强,锁定所有外部可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行凡是使用该指令访问共享资源的代码所

18、有的任务只影响竞争共享只影响竞争共享资源的任务资源的任务对系统响应时间对系统响应时间的影响的影响如果关中断的时间较长,对系统的响应性能有很大影响较小如果禁止切换的时间过长,则影响系统的响应性能对系统响应性能对系统响应性能有一定影响,有一定影响,可可能导致优先级反能导致优先级反转转实现时的系统开实现时的系统开销销小小小较大较大注意事项注意事项关中断时间要尽关中断时间要尽量短量短不是所有的处理不是所有的处理器都具备这种指器都具备这种指令,影响可移植令,影响可移植性性关调度的时间要关调度的时间要尽量短尽量短需采用一定的策需采用一定的策略解决优先级反略解决优先级反转问题转问题各种互斥机制比较各种互斥机

19、制比较电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3 二值信号量二值信号量q用于用于任务与任务之间任务与任务之间、任务与中断服务程序任务与中断服务程序之之间的同步间的同步v用于同步的二值信号量初始值为用于同步的二值信号量初始值为0,表示同步事件,表示同步事件尚未产生;尚未产生;v任务任务申请信号量申请信号量以等待该同步事件的发生;以等待该同步事件的发生;v另一个任务或另一个任务或ISR到达同步点时,到达同步点时,释放信号量释放信号量(将其将其值设置为值设置为1)表示同步事件已发生,以唤醒等待的任表示同步事件已发生,以唤醒等待的任务。务。Task1Task2二值信号量二值信号量初

20、值为初值为0电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心二值信号量状态图二值信号量状态图可获得可获得不可获得不可获得申请并获得申请并获得(值为值为0)释放释放(值为值为1)初始化初始化值为值为0电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Task1()执行一些操作执行一些操作;将信号量将信号量sem1置置1;申请信号量申请信号量sem2;Task2()申请信号量申请信号量sem1;执行一些操作执行一些操作;将信号量将信号量sem2置置1;Task2申请信号申请信号量量sem1失败,系失败,系统切换到统切换到Task1sem1被置被置1后,后,Task2得到得到s

21、em1并并抢占抢占Task1Task2运行到某运行到某处时因某种原因处时因某种原因被阻塞,系统切被阻塞,系统切换到换到Task1电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心4 计数信号量计数信号量 用于控制系统中用于控制系统中共享资源的多个实例共享资源的多个实例的使的使用,允许多个任务同时访问同一种资源的用,允许多个任务同时访问同一种资源的多个实例。多个实例。计数信号量被初始化为计数信号量被初始化为n(非负整数非负整数),n为为该种该种共享资源的数目共享资源的数目。Task1Task2共享资源实例共享资源实例nTask m共享资源实例共享资源实例1电子科技大学嵌入式软件工程中心

22、电子科技大学嵌入式软件工程中心计数信号量状态图计数信号量状态图可获得可获得不可获得不可获得初始化初始化值大于值大于0申请并获得申请并获得值为值为0释放释放值为值为1申请并获得申请并获得值减值减1释放释放值加值加1电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 1 2 3 4 n生产者任务生产者任务消费者任务消费者任务计数信号量使用实例:有界缓冲问题计数信号量使用实例:有界缓冲问题电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心生产者任务生产者任务do 产生一个数据项产生一个数据项 申请申请empty 申请申请mutex 将新生成的数据项添加到缓冲中将新生成的数据项添加

23、到缓冲中 释放释放mutex 释放释放full while(1);消费者任务消费者任务do 申请申请full 申请申请mutex 从缓冲中移出一个数据项的内容从缓冲中移出一个数据项的内容 释放释放mutex 释放释放empty 消费新获得的数据项内容消费新获得的数据项内容 while(1);计数信号量计数信号量full:已被填充的数据项数目,取值范围:已被填充的数据项数目,取值范围0n,初始值为,初始值为0计数信号量计数信号量empty:空闲数据项数目,取值范围为:空闲数据项数目,取值范围为0n,初始值为,初始值为n;互斥信号量互斥信号量mutex:控制生产者任务和消费者任务对有界缓冲的访问,

24、:控制生产者任务和消费者任务对有界缓冲的访问,初始值为初始值为1。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心5 信号量机制的主要数据结构信号量机制的主要数据结构SCB1SCB2信号量控制块信号量控制块count信号量名字或信号量名字或IDTask1Task2任务等待列表任务等待列表电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q信号量控制块信号量控制块:管理所有创建的信号量,内核:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块。在系统运行时动态分配和回收信号量控制块。q 互斥和二值信号量控制块结构互斥和二值信号量控制块结构:Binary_Sem

25、aphore_Control_Blockwait_queue 任务等待队列任务等待队列attributes信号量属性信号量属性lock_nesting_behavior试图嵌套获得时的规则试图嵌套获得时的规则 wait_discipline 任务等待信号量的方式任务等待信号量的方式priority_ceiling 优先级天花板值优先级天花板值lock是否被占有是否被占有holder拥有者拥有者 nest_count 嵌套层数嵌套层数电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q计数信号量控制结构计数信号量控制结构Counting_Semaphore_Control_Block

26、wait_queue任务等待队列任务等待队列 attributes计数信号量属性计数信号量属性 maximum_count最大计数值最大计数值 wait_discipline任务等待信号量的方式任务等待信号量的方式 count当前计数值当前计数值电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-IIq事件控制块事件控制块ECB同步与通信机制的基本数据同步与通信机制的基本数据结构结构typedef structINT8UOSEventType;/事件类型事件类型INT16UOSEventCnt;/计数器计数器(信号量信号量)

27、void*OSEventPtr;/指向消息或消息队列的指针指向消息或消息队列的指针INT8UOSEventGrp;/等待任务所在的事件组等待任务所在的事件组INT8UOSEventTblOS_EVENT_TBL_SIZE;/等等待任务的事件表待任务的事件表OS_EVENT;/等待事件的任务中,优先级最高的任务获等待事件的任务中,优先级最高的任务获得事件。得事件。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q当一个事件发生当一个事件发生后,等待事件列后,等待事件列表中优先级最高表中优先级最高的任务的任务(即即在在.OSEventTbl&OSEventGrp中所有被置中所有被置1的

28、的位中优先级数值位中优先级数值最小的任务最小的任务)得得到该事件。到该事件。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q 当当.OSEventTbln中的任何一位中的任何一位为为1时,时,OSEventGrp中中的第的第n位为位为1。与任务就绪列表与任务就绪列表类似!类似!电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q将一个任务插入到等待事件将一个任务插入到等待事件的任务列表中:的任务列表中:pevent-OSEventGrp|=OSMapTblprio 3;pevent-OSEventTblprio 3|=OSMapTblprio&0 x07;与将一个任务插

29、入到就绪列表中与将一个任务插入到就绪列表中的操作类似!的操作类似!Index Bit mask(Binary)0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 1 02 0 0 0 0 0 1 0 03 0 0 0 0 1 0 0 04 0 0 0 1 0 0 0 05 0 0 1 0 0 0 0 06 0 1 0 0 0 0 0 07 1 0 0 0 0 0 0 0电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q从等待事件的任务列表中使任务脱离等从等待事件的任务列表中使任务脱离等待状态待状态if(pevent-OSEventTblprio 3&=OSMapTblpr

30、io&0 x07)=0)pevent-OSEventGrp&=OSMapTblprio 3;与将任务从就绪列表中清除的操作类似!与将任务从就绪列表中清除的操作类似!电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q在等待事件的任务列表中查找优先级最在等待事件的任务列表中查找优先级最高的任务高的任务y=OSUnMapTblpevent-OSEventGrp;x=OSUnMapTblpevent-OSEventTbly;prio=(y OSEventPtr;if(pevent!=(OS_EVENT*)0)/初始化初始化ECB的各个域的各个域pevent-OSEventType=OS_E

31、VENT_TYPE_SEM;/事件类型为信号事件类型为信号量量pevent-OSEventCnt=cnt;/信号量的初始计数值信号量的初始计数值pevent-OSEventPtr=(void*)0;OS_EventWaitListInit(pevent);/初始化等待任务列表初始化等待任务列表return(pevent);/调用者需检查返回值,如果为调用者需检查返回值,如果为NULL则表示建立失败则表示建立失败电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心6.2 获取获取(申请申请)信号量信号量q功能:试图获得应用指定的信号量。功能:试图获得应用指定的信号量。if 信号量的值大于

32、信号量的值大于0then 将信号量的值减将信号量的值减1else 根据接收信号量的选项,将任务放根据接收信号量的选项,将任务放到等待队列中,或是直接返回到等待队列中,或是直接返回电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q当所申请的信号量不能被立即获得时,当所申请的信号量不能被立即获得时,可以有以下几种选择:可以有以下几种选择:v永远等待。永远等待。v不等待,立即返回,并返回一个错误状态不等待,立即返回,并返回一个错误状态码。码。v指定等待时限指定等待时限(可有效避免死锁可有效避免死锁)。注意:注意:v不允许在不允许在ISR中中选择等待。选择等待。v当任务选择等待时,将被按当

33、任务选择等待时,将被按FIFO或或优先级优先级顺序顺序放置在等待队列中。放置在等待队列中。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心44t0t0t1t2t3t4t5t6t7t8Critical section guarded by Stime12t9t0t10t11t12t13t14t15t16t18t17假定在时间假定在时间t1,任务,任务T2获得信号量获得信号量S2,进入临界区。,进入临界区。在时间在时间t3,任务,任务T2又试图获得信号量又试图获得信号量S1,但一个高优先级任务,但一个高优先级任务T1在这在这个时候就绪,抢占任务个时候就绪,抢占任务T2并获得信号量并获得

34、信号量S1,接下来任务,接下来任务T1又试图获得又试图获得信号量信号量S2。这样就出现了这样就出现了死锁现象死锁现象。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q如果任务等待一个使用如果任务等待一个使用优先级继承算法优先级继承算法的互的互斥信号量,且它的优先级高于当前正占有此斥信号量,且它的优先级高于当前正占有此信号量的任务的优先级,那么占有信号量的信号量的任务的优先级,那么占有信号量的任务将继承这个被阻塞的任务的优先级。任务将继承这个被阻塞的任务的优先级。q如果任务成功地获得一个采用如果任务成功地获得一个采用优先级天花板优先级天花板算法算法的互斥信号量,它的优先级又低于优先

35、的互斥信号量,它的优先级又低于优先级天花板,那么它的优先级将被抬升至天花级天花板,那么它的优先级将被抬升至天花板。板。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void OSSemPend(OS_EVENT*pevent,INT16U timeout,INT8U*err)if(pevent-OSEventCnt 0)/信号量值大于信号量值大于0,成功获得信号量并返回,成功获得信号量并返回pevent-OSEventCnt-;*err=OS_NO_ERR;return;OSTCBCur-OSTCBStat|=OS_STAT_SEM;/设置任务状态为等待信号量设置任务状态为等待信

36、号量OSTCBCur-OSTCBDly=timeout;/设置等待时限设置等待时限OS_EventTaskWait(pevent);/将任务放置到信号量的等待列表中将任务放置到信号量的等待列表中 OS_Sched();/内核实施任务调度,系统切换到另一就绪任务执行内核实施任务调度,系统切换到另一就绪任务执行if(OSTCBCur-OSTCBStat&OS_STAT_SEM)/判断任务恢复执行的原因,判断任务恢复执行的原因,如果等待时限超时但仍然未获得信号量,则返回超时信息如果等待时限超时但仍然未获得信号量,则返回超时信息OSEventTO(pevent);*err=OS_TIMEOUT;ret

37、urn;OSTCBCur-OSTCBEventPtr=(OS_EVENT*)0;*err=OS_NO_ERR;/任务由于获得信号量而恢复执行,本调用成功返回任务由于获得信号量而恢复执行,本调用成功返回获取获取(等待等待)信号量信号量电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT16U OSSemAccept(OS_EVENT*pevent)INT16U cnt;cnt=pevent-OSEventCnt;if(cnt 0)pevent-OSEventCnt-;return(cnt);注意:即使不能成功获得信号量注意:即使不能成功获得信号量(返回值为返回值为0),调用者也,调

38、用者也不会被阻塞。此函数可以在中断处理程序中使用。不会被阻塞。此函数可以在中断处理程序中使用。获取获取(无等待地请求无等待地请求)信号量信号量电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心6.3 释放信号量释放信号量q功能:释放一个应用指定的信号量。功能:释放一个应用指定的信号量。if 没有任务等待这个信号量没有任务等待这个信号量then 信号量的值加信号量的值加1 else 将信号量分配给一个等待任务将信号量分配给一个等待任务(将相将相应的任务移出等待队列,使其就绪应的任务移出等待队列,使其就绪)q如果使用了如果使用了优先级继承优先级继承或或优先级天花板优先级天花板算法:算法:

39、v执行该功能执行该功能(系统调用系统调用)的任务的优先级将的任务的优先级将恢恢复到原来的优先级复到原来的优先级。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT8U OSSemPost(OS_EVENT*pevent)if(pevent-OSEventGrp!=0 x00)/如果有任务在等待该信号量如果有任务在等待该信号量OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/使等待任务列使等待任务列表中优先级最高的任务就绪表中优先级最高的任务就绪OS_Sched();/内核实施任务调度内核实施任务调度return(OS_NO_ERR);/

40、成功返回成功返回 if(pevent-OSEventCnt OSEventCnt+;/信号量的值加信号量的值加1return(OS_NO_ERR);/成功返回成功返回 return(OS_SEM_OVF);/信号量溢出信号量溢出电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心6.4 删除删除信号量信号量q功能:从系统中删除应用指定的一个信功能:从系统中删除应用指定的一个信号量。号量。q内核动作:内核动作:将信号量控制块返还给系统将信号量控制块返还给系统。q删除信号量的不一定是创建信号量的任删除信号量的不一定是创建信号量的任务。务。q如果有任务如果有任务正在等待获得该信号量:正在等待

41、获得该信号量:v执行此功能将使所有等待这个信号量的任务执行此功能将使所有等待这个信号量的任务回到回到就绪队列就绪队列中。中。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q企图获取已删除的信号量将返回一个错企图获取已删除的信号量将返回一个错误;误;q互斥信号量:互斥信号量:正被使用时正被使用时(已经被某任务已经被某任务获取获取),不能删除它。,不能删除它。v因为该信号量正在保护一个共享资源或临界因为该信号量正在保护一个共享资源或临界代码段,该动作可能造成代码段,该动作可能造成数据崩溃或其他严数据崩溃或其他严重问题重问题。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心

42、OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8U opt,INT8U*err)BOOLEAN tasks_waiting;if(pevent-OSEventGrp!=0 x00/根据是否有任务在等待信号量设置等待标志根据是否有任务在等待信号量设置等待标志tasks_waiting=TRUE;elsetasks_waiting=FALSE;switch(opt)case OS_DEL_NO_PEND:/如果有任务等待信号量则不删除信号量如果有任务等待信号量则不删除信号量if(task_waiting=FALSE/没有任务等待,释放没有任务等待,释放ECB回空闲链回空

43、闲链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);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心case OS_DEL_ALWAYS:/无论有无任务等待都删除信号量无论有无任务等待都删除信

44、号量/将等待列表中的每个任务都设置成就绪将等待列表中的每个任务都设置成就绪while(pevent-OSEventGrp!=0 x00)OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/释放该信号量的释放该信号量的ECB回空闲控制块链回空闲控制块链pevent-OSEventType=OS_EVENT_TYPE_UNUSED;pevent-OSEventPtr=OSEventFreeList;OSEventFreeList=pevent;/如果之前有任务等待信号量,内核实施任务调度如果之前有任务等待信号量,内核实施任务调度if(tasks_waitin

45、g=TRUE)OS_Sched();*err=OS_NO_ERR;return(OS_EVENT*)0);default:*err=OS_ERR_INVALID_OPT;return(pevent);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第三节第三节邮箱和消息队列邮箱和消息队列1 通信方式概述2 消息队列机制的主要数据结构3 典型的消息队列操作4 消息队列的其他典型使用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q任务间的通信方式任务间的通信方式v直接通信直接通信。在通信过程中双方必须明确地。在通信过程中双方必须明确地知道(命名)彼此:知道(命名)彼此:s

46、end(P,message)发送一个消息到任务发送一个消息到任务P。receive(Q,message)从任务从任务Q接收一个消接收一个消息。息。v间接通信间接通信。通信双方不需要指出消息的来。通信双方不需要指出消息的来源或去向,而通过中间机制来通信。如:源或去向,而通过中间机制来通信。如:send(A,message)发送一个消息给邮箱发送一个消息给邮箱A。receive(A,message)从邮箱从邮箱A接收一个消接收一个消息。息。1 通信方式概述通信方式概述电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q消息队列:消息队列:属于属于间接通信间接通信方式。方式。v消息:消息:

47、内存空间中一段长度可变的缓冲区,内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义。其长度和内容均可以由用户定义。q对消息内容的解释由应用完成。对消息内容的解释由应用完成。v从从操作系统操作系统观点看,消息没有定义的格式,观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。所有的消息都是字节流,没有特定的含义。v从从应用应用观点看,根据应用定义的消息格式,观点看,根据应用定义的消息格式,消息被解释成特定的含义。消息被解释成特定的含义。v应用可以只把消息当成一个标志,这时消息应用可以只把消息当成一个标志,这时消息机制用于实现机制用于实现同步。同步。电子科技大学嵌入式软件工

48、程中心电子科技大学嵌入式软件工程中心q一些操作系统内核把消息进一步分为:一些操作系统内核把消息进一步分为:v邮箱:邮箱:仅能存放单条消息,它提供了一种低开销的机仅能存放单条消息,它提供了一种低开销的机制来传送信息。制来传送信息。每个邮箱可以保存一条大小为若干个字节的消每个邮箱可以保存一条大小为若干个字节的消息。息。v消息队列:消息队列:可存放若干消息,提供了一种任务间缓冲通信可存放若干消息,提供了一种任务间缓冲通信的方法。的方法。消息机制可支持消息机制可支持定长定长与与可变长度可变长度两种模式的消两种模式的消息息可变长度的消息队列需要对队列中的每一条消息增加可变长度的消息队列需要对队列中的每一

49、条消息增加额外的存储开销。额外的存储开销。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2 消息队列机制的主要数据结构消息队列机制的主要数据结构队列控制块队列控制块队列长度队列长度QCB1队列名或队列名或IDTask3Task4接收任务等待列接收任务等待列表表Task1Task2发送任务等待列发送任务等待列表表最大最大消息消息长度长度QCB2消息队列及其相关的参数和支持数据结构消息队列及其相关的参数和支持数据结构 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2.1 消息队列状态图消息队列状态图非空非空满满队列创建队列创建消息数为消息数为0消息队列状态图消息队列状态

50、图消息发送消息发送消息数加消息数加1空空消息发送消息发送消息数为消息数为1消息接收消息接收消息数为消息数为0消息接收消息接收消息数减消息数减1消息接收消息接收消息数减消息数减1消息发送消息发送消息数等于队列长度消息数等于队列长度电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2.2 消息队列机制的主要数据结构消息队列机制的主要数据结构q消息队列控制块消息队列控制块v管理所有创建的消息队列,系统运行时动态分配和管理所有创建的消息队列,系统运行时动态分配和回收消息队列控制块回收消息队列控制块q消息队列缓冲区消息队列缓冲区v存放发送到该队列的消息,存放发送到该队列的消息,接收者接收者从缓

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(05-嵌入式系统开发-Chapter6-同步、互斥与通信资料课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|