05嵌入式系统开发Chapter6同步互斥与通信

上传人:鲁** 文档编号:590905490 上传时间:2024-09-16 格式:PPT 页数:126 大小:1.11MB
返回 下载 相关 举报
05嵌入式系统开发Chapter6同步互斥与通信_第1页
第1页 / 共126页
05嵌入式系统开发Chapter6同步互斥与通信_第2页
第2页 / 共126页
05嵌入式系统开发Chapter6同步互斥与通信_第3页
第3页 / 共126页
05嵌入式系统开发Chapter6同步互斥与通信_第4页
第4页 / 共126页
05嵌入式系统开发Chapter6同步互斥与通信_第5页
第5页 / 共126页
点击查看更多>>
资源描述

《05嵌入式系统开发Chapter6同步互斥与通信》由会员分享,可在线阅读,更多相关《05嵌入式系统开发Chapter6同步互斥与通信(126页珍藏版)》请在金锄头文库上搜索。

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

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

3、与ISR之间进行,因为之间进行,因为ISR不能等待不能等待。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心ISRxTaskyPOSTPEND任务与任务与任务与任务与ISRISR之间的同步之间的同步之间的同步之间的同步( (单向单向单向单向) )TaskxTaskyPOSTPENDPOSTPEND任务与任务任务与任务任务与任务任务与任务之间的同步之间的同步之间的同步之间的同步( (双向双向双向双向) )任务与任务任务与任务任务与任务任务与任务之间的同步之间的同步之间的同步之间的同步( (单向单向单向单向) )TaskxTaskyPOSTPEND电子科技大学嵌入式软件工程中心电子科技

4、大学嵌入式软件工程中心q任务间的耦合程度:任务间的耦合程度:q耦合程度较高耦合程度较高q任务之间需要进行大量的通信,相应的任务之间需要进行大量的通信,相应的系统开销较大;系统开销较大;q耦合程度较低耦合程度较低q任务之间不存在通信需求,其间的同步任务之间不存在通信需求,其间的同步关系很弱甚至不需要同步或互斥,系统关系很弱甚至不需要同步或互斥,系统开销较小。开销较小。q研究任务间耦合程度的上下对于合理地研究任务间耦合程度的上下对于合理地设计应用系统、划分任务有很重要的作设计应用系统、划分任务有很重要的作用。用。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q在单处理器平台上,嵌入式

5、操作系统内核在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:提供的同步、互斥与通信机制主要包括:v信号量信号量(semaphore),用于互斥与同步。,用于互斥与同步。v事件事件(组组)(eventgroup),用于同步。,用于同步。v异步信号异步信号(asynchronoussignal),用于同,用于同步。步。v邮箱邮箱(mailbox)、消息队列消息队列(messagequeue),用于消息通信。,用于消息通信。v管道管道(pipe),提供非结构化数据交换和实现,提供非结构化数据交换和实现同步。同步。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q以

6、下一些机制也可用于同步与通信以下一些机制也可用于同步与通信(在在单处理器或多处理器系统中单处理器或多处理器系统中):v全局变量。全局变量。v共享内存。共享内存。vSockets。v远程过程调用远程过程调用(RemoteProcedureCall)。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第二节第二节信号量信号量1 信号量的种类及用途2 互斥信号量3 二值信号量4 计数信号量5 信号量机制的主要数据结构6 典型的信号量操作电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q信号量用于实现任务与任务之间、任务信号量用于实现任务与任务之间、任务与中断处理程序之间的与中断

7、处理程序之间的同步同步与与互斥互斥。q信号量一般分为三种:信号量一般分为三种:1信号量的种类及用途信号量的种类及用途用于解决互斥问题。用于解决互斥问题。可能会引起优先可能会引起优先级反转问题。级反转问题。用于解决同步问题。用于解决同步问题。用于解决资源计数问题。用于解决资源计数问题。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q用互斥信号量保护的代码区称作用互斥信号量保护的代码区称作“临界区。临界区。q临界区代码通常用于对共享资源的访问。临界区代码通常用于对共享资源的访问。q获得互斥信号量的任务进入获得互斥信号量的任务进入“临界区,其临界区,其他试图获取信号量的任务就会被阻塞。

8、他试图获取信号量的任务就会被阻塞。q当任务离开临界区时,就是释放信号量。当任务离开临界区时,就是释放信号量。q互斥信号量的值被初始化成互斥信号量的值被初始化成1,说明目前没有,说明目前没有任务进入任务进入“临界区,但最多只有一个任务可临界区,但最多只有一个任务可以进入以进入“临界区。临界区。2互斥信号量互斥信号量Task1Task2共享资源共享资源电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心13INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)OS_STK*psp;INT8Uerr;O

9、S_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)/*Makesuretaskdoesntalreadyexistatthispriority*/OSTCBPrioTblprio=(OS_TCB*)1;/*Reservetheprioritytopreventothersfromdoingthesamethinguntiltaskiscreated.*/OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initializethetasksstack*/err=O

10、S_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();OSTaskCtr+;/*Incrementthe#taskscounter*/OS_EXIT_CRITICAL();if(OSRunning=TRUE)/*Findhighestprioritytaskifmultitaskinghasstarted*/OS_Sched();elseOS_ENTER_CRITICAL();OSTCBPrioTblprio=(OS_TCB*)0;/*Makethispriorityavailabl

11、etoothers*/OS_EXIT_CRITICAL();return(err);OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);OSTaskCreateinucOSOSTaskCreateinucOS电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q共享资源:共享资源:v一段存储器空间、一个数据结构或一段存储器空间、一个数据结构或I/O设备,也可能设备,也可能是被两个或多个并发任务共享的任何内容。是被两个或多个并发任务共享的任何内容。q使用互斥信号量可以实现使用互斥信号量可以实现对共享资源的串行访对共享资源的串行访问问。互斥信号量状态图互斥信号

12、量状态图开启开启锁定锁定初始化初始化值为值为1申请并获得申请并获得值为值为0释放释放值为值为1申请申请(递归递归)并获得并获得锁定数加锁定数加1释放释放(递归递归)锁定数减锁定数减1电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q所有权所有权v当一个任务通过当一个任务通过获取互斥信号量获取互斥信号量而将其锁定而将其锁定时,得到该互斥信号量的所有权。时,得到该互斥信号量的所有权。v当一个任务当一个任务释放信号量释放信号量时,失去对其的所有时,失去对其的所有权。权。v申请与释放要匹配申请与释放要匹配:任务要释放互斥信号量,:任务要释放互斥信号量,必须事前先获取该信号量。必须事前先获取

13、该信号量。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心16INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)OS_STK*psp;INT8Uerr;OS_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)/*Makesuretaskdoesntalreadyexistatthispriority*/OSTCBPrioTblprio=(OS_TCB*)1;/*Reservetheprioritytopreventothersfromdoing

14、thesamethinguntiltaskiscreated.*/OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initializethetasksstack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();OSTaskCtr+;/*Incrementthe#taskscounter*/OS_EXIT_CRITICAL();if(OSRunning=TRUE)/*Findhigh

15、estprioritytaskifmultitaskinghasstarted*/OS_Sched();elseOS_ENTER_CRITICAL();OSTCBPrioTblprio=(OS_TCB*)0;/*Makethispriorityavailabletoothers*/OS_EXIT_CRITICAL();return(err);OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);OSTaskCreateinucOSOSTaskCreateinucOS电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Task1RoutineARoutineB

16、q嵌套资源访问嵌套资源访问v如果如果Task1调用调用RoutineA,而,而RoutineA又又调用调用RoutineB,并且三者访问相同的共享,并且三者访问相同的共享资源,就发生了递归共享资源的访问同步问资源,就发生了递归共享资源的访问同步问题。题。共享资源共享资源 一个递归的互斥信一个递归的互斥信号量允许嵌套锁定号量允许嵌套锁定互斥信号量,而不互斥信号量,而不引起死锁。引起死锁。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心v每个获取信号量的调用必须与释放信号量的每个获取信号量的调用必须与释放信号量的调用相匹配。调用相匹配。v当最外层的获取信号量的调用与释放信号量当最外层的

17、获取信号量的调用与释放信号量的调用匹配时,该信号量才允许被其它任务的调用匹配时,该信号量才允许被其它任务访问。访问。v用于同步的信号量不支持嵌套访问。用于同步的信号量不支持嵌套访问。v删除平安删除平安v需要保护在临界区执行的任务不会被意外地需要保护在临界区执行的任务不会被意外地删除。删除。v删除一个在临界区执行的任务可能引起意想删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,不到的后果,造成保护资源的信号量不可用,可能导致资源处于破坏状态。可能导致资源处于破坏状态。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心比较项目比较项目关中断关中断使用测试并置

18、位使用测试并置位指令指令禁止任务禁止任务切换切换使用信号量使用信号量锁定范围锁定范围互互斥斥力力度度最最强强,锁定所有外部可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行凡是使用该指令访问共享资源的代码所有的任务只只影影响响竞竞争争共共享享资源的任务资源的任务对系统响应时间对系统响应时间的影响的影响如果关中断的时间较长,对系统的响应性能有很大影响较小如果禁止切换的时间过长,则影响系统的响应性能对对系系统统响响应应性性能能有有一一定定影影响响,可可能能导导致致优优先先级级反反转转实现时的系统开实现时的系统开销销小小小较大较大注意事项注意事项关关中中断断时时间间要

19、要尽尽量短量短不不是是所所有有的的处处理理器器都都具具备备这这种种指指令令,影影响响可可移移植植性性关关调调度度的的时时间间要要尽量短尽量短需需采采用用一一定定的的策策略略解解决决优优先先级级反反转问题转问题各种互斥机制比较各种互斥机制比较电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3二值信号量二值信号量q用于任务与任务之间、任务与中断效劳程序之用于任务与任务之间、任务与中断效劳程序之间的同步间的同步q用于同步的二值信号量初始值为用于同步的二值信号量初始值为0,表示同步,表示同步事件尚未产生;事件尚未产生;q任务申请信号量以等待该同步事件的发生;任务申请信号量以等待该同步事件的

20、发生;q另一个任务或另一个任务或ISR到达同步点时,释放信号量到达同步点时,释放信号量(将其值设置为将其值设置为1)表示同步事件已发生,以唤表示同步事件已发生,以唤醒等待的任务。醒等待的任务。Task1Task2二值信号量二值信号量初值为初值为0电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心二值信号量状态图二值信号量状态图可获得可获得不可获得不可获得申请并获得申请并获得(值为值为0)释放释放(值为值为1)初始化初始化值为值为0电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Task1()执行一些操作执行一些操作;将信号量将信号量sem1置置1;申请信号量申请信号量se

21、m2;Task2()申请信号量申请信号量sem1;执行一些操作执行一些操作;将信号量将信号量sem2置置1;Task2申申 请请 信信 号号量量sem1失失败败,系系统切换到统切换到Task1sem1被被 置置 1后后 ,Task2得得到到sem1并并抢占抢占Task1Task2运运 行行 到到 某某处处时时因因某某种种原原因因被被阻阻塞塞,系系统统切切换到换到Task1用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步 Task2Task2优先级高于优先级高于优先级高于优先级高于Task1T

22、ask1 sem1sem1和和和和sem2sem2的初始值均为的初始值均为的初始值均为的初始值均为0 0电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心4计数信号量计数信号量用于控制系统中用于控制系统中共享资源的多个实例共享资源的多个实例的使的使用,允许多个任务同时访问同一种资源的用,允许多个任务同时访问同一种资源的多个实例。多个实例。计数信号量被初始化为计数信号量被初始化为n(非负整数非负整数),n为为该种该种共享资源的数目共享资源的数目。Task1Task2共享资源实例共享资源实例nTaskm共享资源实例共享资源实例1电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心

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

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

25、子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心5信号量机制的主要数据结构信号量机制的主要数据结构SCB1SCB2信号量控制块信号量控制块count信号量名字或信号量名字或IDTask1Task2任务等待列表任务等待列表电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q信号量控制块:管理所有创立的信号量,内核在信号量控制块:管理所有创立的信号量,内核在系统运行时动态分配和回收信号量控制块。系统运行时动态分配和回收信号量控制块。q互斥和二值信号量控制块结构互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue 任务等待队

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

27、计数信号量属性maximum_count最大计数值最大计数值wait_discipline任务等待信号量的方式任务等待信号量的方式count当前计数值当前计数值电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心信号量内部实现机制实例说明信号量内部实现机制实例说明C/OS-IIq事件控制块事件控制块ECB同步与通信机制的根本数据同步与通信机制的根本数据结构结构qtypedefstructqINT8UOSEventType;/事件类型事件类型qINT16U OSEventCnt;/计数器计数器(信号量信号量)qvoid*OSEventPtr;/指向消息或消息队列指向消息或消息队列的指针的

28、指针qINT8UOSEventGrp;/等待任务所在的事件等待任务所在的事件组组qINT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任务的事件表等待任务的事件表qOS_EVENT;/等待事件的任务中,优先级最高等待事件的任务中,优先级最高的任务获得事件。的任务获得事件。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q当一个事件发生当一个事件发生后,等待事件列后,等待事件列表中优先级最高表中优先级最高的任务的任务(即在即在.OSEventTbl&OSEventGrp中所有被置中所有被置1的的位中优先级数值位中优先级数值最小的任务最小的任务)得得到该事件。到该事

29、件。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q当当.OSEventTbln中的任何一位为中的任何一位为1时,时,OSEventGrp中中的第的第n位为位为1。与任务就绪列表与任务就绪列表类似!类似!电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q将一个任务插入到等待事件将一个任务插入到等待事件的任务列表中:的任务列表中:pevent-OSEventGrp|=OSMapTblprio3;pevent-OSEventTblprio3|=OSMapTblprio&0x07;与将一个任务插入到就绪列表中与将一个任务插入到就绪列表中的操作类似!的操作类似!IndexBi

30、tmask(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从等待事件的任务列表中使任务脱离等从等待事件的任务列表中使任务脱离等待状态待状态qif(pevent-OSEventTblprio3&=OSMapTblprio&0x07)=0)qpevent-OSEventGrp&=OSMapTblpri

31、o3;qq与将任务从就绪列表中去除的操作类似!与将任务从就绪列表中去除的操作类似!电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q在等待事件的任务列表中查找优先级最在等待事件的任务列表中查找优先级最高的任务高的任务y=OSUnMapTblpevent-OSEventGrp;x=OSUnMapTblpevent-OSEventTbly;prio=(yOSEventPtr;if(pevent!=(OS_EVENT*)0)/初始化初始化ECB的各个域的各个域pevent-OSEventType=OS_EVENT_TYPE_SEM;/事件类型为信号事件类型为信号量量pevent-OSEv

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

33、号量量的的选选项项,将将任任务务放放到等待队列中,或是直接返回到等待队列中,或是直接返回电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q当所申请的信号量不能被立即获得时,当所申请的信号量不能被立即获得时,可以有以下几种选择:可以有以下几种选择:q永远等待。永远等待。q不等待,立即返回,并返回一个错误状不等待,立即返回,并返回一个错误状态码。态码。q指定等待时限指定等待时限(可有效防止死锁可有效防止死锁)。q注意:注意:q不允许在不允许在ISR中选择等待。中选择等待。q当任务选择等待时,将被按当任务选择等待时,将被按FIFO或优或优先级顺序放置在等待队列中。先级顺序放置在等待队列中

34、。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心44t0t0t1t2t3t4t5t6t7t8CriticalsectionguardedbyStime12t9t0t10t11t12t13t14t15t16t18t17假定在时间假定在时间t1,任务,任务T2获得信号量获得信号量S2,进入临界区。,进入临界区。在时间在时间t3,任务,任务T2又试图获得信号量又试图获得信号量S1,但一个高优先级任务,但一个高优先级任务T1在这在这个时候就绪,抢占任务个时候就绪,抢占任务T2并获得信号量并获得信号量S1,接下来任务,接下来任务T1又试图获得又试图获得信号量信号量S2。这样就出现了这样就出

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

36、将被抬升至天花板。板。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心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_EventTa

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

38、_ERR;/任务由于获得信号量而恢复执行,本调用成功返回任务由于获得信号量而恢复执行,本调用成功返回获取获取(等待等待)信号量信号量电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT16UOSSemAccept(OS_EVENT*pevent)INT16Ucnt;cnt=pevent-OSEventCnt;if(cnt0)pevent-OSEventCnt-;return(cnt);注意:即使不能成功获得信号量注意:即使不能成功获得信号量(返回值为返回值为0),调用者也,调用者也不会被阻塞。此函数可以在中断处理程序中使用。不会被阻塞。此函数可以在中断处理程序中使用。获取获取(无

39、等待地请求无等待地请求)信号量信号量电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心6.3释放信号量释放信号量q功能:释放一个应用指定的信号量。功能:释放一个应用指定的信号量。if没有任务等待这个信号量没有任务等待这个信号量then信号量的值加信号量的值加1else将将信信号号量量分分配配给给一一个个等等待待任任务务(将将相相应的任务移出等待队列,使其就绪应的任务移出等待队列,使其就绪)q如果使用了如果使用了优先级继承优先级继承或或优先级天花板优先级天花板算法:算法:v执行该功能执行该功能(系统调用系统调用)的任务的优先级将的任务的优先级将恢恢复到原来的优先级复到原来的优先级。电子

40、科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT8UOSSemPost(OS_EVENT*pevent)if(pevent-OSEventGrp!=0x00)/如果有任务在等待该信号量如果有任务在等待该信号量OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/使等待任务列使等待任务列表中优先级最高的任务就绪表中优先级最高的任务就绪OS_Sched();/内核实施任务调度内核实施任务调度return(OS_NO_ERR);/成功返回成功返回if(pevent-OSEventCntOSEventCnt+;/信号量的值加信号量的值加1return

41、(OS_NO_ERR);/成功返回成功返回return(OS_SEM_OVF);/信号量溢出信号量溢出电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心6.4删除删除信号量信号量q功能:从系统中删除应用指定的一个信功能:从系统中删除应用指定的一个信号量。号量。q内核动作:将信号量控制块返还给系统。内核动作:将信号量控制块返还给系统。q删除信号量的不一定是创立信号量的任删除信号量的不一定是创立信号量的任务。务。q如果有任务正在等待获得该信号量:如果有任务正在等待获得该信号量:q执行此功能将使所有等待这个信号量的执行此功能将使所有等待这个信号量的任务回到就绪队列中。任务回到就绪队列中。电

42、子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q企图获取已删除的信号量将返回一个错企图获取已删除的信号量将返回一个错误;误;q互斥信号量:互斥信号量:正被使用时正被使用时(已经被某任务已经被某任务获取获取),不能删除它。,不能删除它。v因为该信号量正在保护一个共享资源或临界因为该信号量正在保护一个共享资源或临界代码段,该动作可能造成代码段,该动作可能造成数据崩溃或其他严数据崩溃或其他严重问题重问题。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err)BOOLEANtas

43、ks_waiting;if(pevent-OSEventGrp!=0x00/根据是否有任务在等待信号量设置等待标志根据是否有任务在等待信号量设置等待标志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=OSEve

44、ntFreeList;OSEventFreeList=pevent;/调整空闲调整空闲ECB链头指针链头指针*err=OS_NO_ERR;return(OS_EVENT)0);else*err=OS_ERR_TASK_WAITING;/有任务等待,删除信号量有任务等待,删除信号量失败失败return(pevent);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心caseOS_DEL_ALWAYS:/无论有无任务等待都删除信号量无论有无任务等待都删除信号量/将等待列表中的每个任务都设置成就绪将等待列表中的每个任务都设置成就绪while(pevent-OSEventGrp!=0x00

45、)OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);/释放该信号量的释放该信号量的ECB回空闲控制块链回空闲控制块链pevent-OSEventType=OS_EVENT_TYPE_UNUSED;pevent-OSEventPtr=OSEventFreeList;OSEventFreeList=pevent;/如果之前有任务等待信号量,内核实施任务调度如果之前有任务等待信号量,内核实施任务调度if(tasks_waiting=TRUE)OS_Sched();*err=OS_NO_ERR;return(OS_EVENT*)0);default:*err=O

46、S_ERR_INVALID_OPT;return(pevent);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第三节第三节邮箱和消息队列邮箱和消息队列1 通信方式概述2 消息队列机制的主要数据结构3 典型的消息队列操作4 消息队列的其他典型使用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q任务间的通信方式任务间的通信方式q直接通信。在通信过程中双方必须明确直接通信。在通信过程中双方必须明确地知道命名彼此:地知道命名彼此:qsend(P,message)发送一个消息到发送一个消息到任务任务P。qreceive(Q,message)从任务从任务Q接收接收一个消息。一

47、个消息。q间接通信。通信双方不需要指出消息的间接通信。通信双方不需要指出消息的来源或去向,而通过中间机制来通信。来源或去向,而通过中间机制来通信。如:如:qsend(A,message)发送一个消息给发送一个消息给邮箱邮箱A。qreceive(A,message)从邮箱从邮箱A接收接收一个消息。一个消息。1通信方式概述通信方式概述电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q消息队列:消息队列:属于属于间接通信间接通信方式。方式。v消息:消息:内存空间中一段长度可变的缓冲区,内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义。其长度和内容均可以由用户定义。q对消息内容

48、的解释由应用完成。对消息内容的解释由应用完成。v从从操作系统操作系统观点看,消息没有定义的格式,观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。所有的消息都是字节流,没有特定的含义。v从从应用应用观点看,根据应用定义的消息格式,观点看,根据应用定义的消息格式,消息被解释成特定的含义。消息被解释成特定的含义。v应用可以只把消息当成一个标志,这时消息应用可以只把消息当成一个标志,这时消息机制用于实现机制用于实现同步。同步。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q一些操作系统内核把消息进一步分为:一些操作系统内核把消息进一步分为:q邮箱:邮箱:q仅能存放单条消

49、息,它提供了一种低开仅能存放单条消息,它提供了一种低开销的机制来传送信息。销的机制来传送信息。q每个邮箱可以保存一条大小为假设干个每个邮箱可以保存一条大小为假设干个字节的消息。字节的消息。q消息队列:消息队列:q可存放假设干消息,提供了一种任务间可存放假设干消息,提供了一种任务间缓冲通信的方法。缓冲通信的方法。q消息机制可支持定长与可变长度两种模消息机制可支持定长与可变长度两种模式的消息式的消息q可变长度的消息队列需要对队列中的每可变长度的消息队列需要对队列中的每一条消息增加额外的存储开销。一条消息增加额外的存储开销。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2消息队列机制的

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

51、收消息数减消息数减1消息接收消息接收消息数减消息数减1消息发送消息发送消息数等于队列长度消息数等于队列长度电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2.2消息队列机制的主要数据结构消息队列机制的主要数据结构q消息队列控制块消息队列控制块q管理所有创立的消息队列,系统运行时动态分管理所有创立的消息队列,系统运行时动态分配和回收消息队列控制块配和回收消息队列控制块q消息队列缓冲区消息队列缓冲区q存放发送到该队列的消息,接收者从缓冲区中存放发送到该队列的消息,接收者从缓冲区中取出消息。取出消息。q消息的发送或接收有两种方法:消息的发送或接收有两种方法:q将数据从发送任务的空间完全拷

52、贝到接收任务将数据从发送任务的空间完全拷贝到接收任务的空间中的空间中(效率较低,执行时间与消息大小有效率较低,执行时间与消息大小有关关)。q只传递指向数据存储空间的指针只传递指向数据存储空间的指针(提高系统性提高系统性能能)。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Sending TaskReceiving TaskMessage1Message1Message1发送任务的发送任务的内存区域内存区域消息队列的消息队列的内存区域内存区域接收任务的接收任务的内存区域内存区域1st copy2nd copy发送和接收消息的消息拷贝和内存使用发送和接收消息的消息拷贝和内存使用发送和

53、接收消息的消息拷贝和内存使用发送和接收消息的消息拷贝和内存使用 这种消息传递方法效率低、占用空间大这种消息传递方法效率低、占用空间大这种消息传递方法效率低、占用空间大这种消息传递方法效率低、占用空间大 一种效率更高的方式是传递消息指针一种效率更高的方式是传递消息指针一种效率更高的方式是传递消息指针一种效率更高的方式是传递消息指针电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqu

54、eue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_message_count消息队列控制块消息队列控制块消息队列缓冲区消息队列缓冲区电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心消息队列的环形缓冲消息队列的环形缓冲消息队列的环形缓冲消息队列的环形缓冲max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指针消息指针电子科技大学嵌入式软件工程中心电子科技大学嵌入

55、式软件工程中心3典型的消息队列操作典型的消息队列操作q创立消息队列创立消息队列q发送普通消息发送普通消息q发送紧急消息发送紧急消息q发送播送消息发送播送消息q接收消息接收消息q删除消息队列删除消息队列q获取有关消息队列的各种信息获取有关消息队列的各种信息 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3.1创立消息队列创立消息队列q创立消息队列时,调用者可以指定如下创立消息队列时,调用者可以指定如下参数:参数:q消息的最大长度。消息的最大长度。q每个消息队列中最多的消息数。每个消息队列中最多的消息数。q消息队列的属性。消息队列的属性。q任务等待消息时的排队方式:任务等待消息时的排

56、队方式:FIFO或或PRIORITYq系统为新创立的消息队列分配唯一的系统为新创立的消息队列分配唯一的ID。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3.2 发送消息发送消息q根据紧急程度的不同,消息通常可分为根据紧急程度的不同,消息通常可分为普通消息与紧急消息。普通消息与紧急消息。q如果有任务正在等待消息如果有任务正在等待消息(即消息队列为即消息队列为空空),那么普通消息发送和紧急消息发送,那么普通消息发送和紧急消息发送的执行效果是一样的。的执行效果是一样的。q任务从等待队列移到就绪队列中,消息任务从等待队列移到就绪队列中,消息被拷贝到任务提供的缓冲区中。被拷贝到任务提供的

57、缓冲区中。q如果没有任务等待:如果没有任务等待:q发送普通消息将消息放在队列尾发送普通消息将消息放在队列尾q发送紧急消息将消息放在队列头发送紧急消息将消息放在队列头电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Msg3接收任务接收任务等待列表等待列表Msg2Msg1消息队列消息队列发送普通消息先进先出发送普通消息先进先出(FIFO)次序)次序Msg3接收任务接收任务等待列表等待列表Msg2Msg1消息队列消息队列发送紧急消息后进先出发送紧急消息后进先出(LIFO)次序)次序电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q如果发送消息时队列已被填满,那么不如果发送消息

58、时队列已被填满,那么不同的操作系统可能采取不同的处理方法:同的操作系统可能采取不同的处理方法:q挂起试图向已满的消息队列中发送消息挂起试图向已满的消息队列中发送消息的任务的任务(不适用于中断效劳程序不适用于中断效劳程序)。q简单地丢弃该条消息并向调用者返回错简单地丢弃该条消息并向调用者返回错误信息。误信息。q播送消息播送消息q在此之前所有试图从队列中接收消息的在此之前所有试图从队列中接收消息的任务此时都将获得相同的消息。任务此时都将获得相同的消息。q该功能拷贝消息到各任务的消息缓冲中,该功能拷贝消息到各任务的消息缓冲中,并唤醒所有的等待任务。并唤醒所有的等待任务。电子科技大学嵌入式软件工程中心

59、电子科技大学嵌入式软件工程中心3.3 接收消息接收消息q如果指定的消息队列中有消息,那么将其如果指定的消息队列中有消息,那么将其中的第一条消息拷贝到调用者的缓冲区,中的第一条消息拷贝到调用者的缓冲区,并从消息队列中删除它。并从消息队列中删除它。q如果此时消息队列中没有消息,那么可能如果此时消息队列中没有消息,那么可能出现以下几种情况:出现以下几种情况:q永远等待消息的到达:等待消息的任务按永远等待消息的到达:等待消息的任务按FIFO或优先级上下顺序排列在等待队列中。或优先级上下顺序排列在等待队列中。q等待消息且指定等待时限:等待消息的任等待消息且指定等待时限:等待消息的任务按务按FIFO或优先

60、级上下顺序排列在等待队或优先级上下顺序排列在等待队列中。列中。q不等待,强制立即返回。不等待,强制立即返回。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q限时等待可有效预防死锁。限时等待可有效预防死锁。q中断效劳程序接收消息时必须选择不等待,中断效劳程序接收消息时必须选择不等待,因为中断效劳程序是不能被阻塞的。因为中断效劳程序是不能被阻塞的。q如果消息队列被应用删除,那么所有等待该如果消息队列被应用删除,那么所有等待该消息队列的任务都被返回一个错误信息,并消息队列的任务都被返回一个错误信息,并回复到就绪状态。回复到就绪状态。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工

61、程中心Task4High消息队列消息队列接收任务等待列表接收任务等待列表任务等待列表基于任务等待列表基于优先级的次序优先级的次序Task2mediumTask3mediumTask1LowTask4High消息队列消息队列接收任务等待列表接收任务等待列表任务等待列表先进先出任务等待列表先进先出(FIFO)次序)次序Task2mediumTask3mediumTask1Low电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3.4删除删除消息队列消息队列q从系统中删除指定的消息队列,释放从系统中删除指定的消息队列,释放消息队列消息队列控制块控制块及及消息队列缓冲区消息队列缓冲区。q任何

62、知道此消息队列任何知道此消息队列ID号的代码都可以删除它。号的代码都可以删除它。q消息队列被删除后,所有等待从这个消息队列消息队列被删除后,所有等待从这个消息队列接收消息的任务都回到接收消息的任务都回到就绪态就绪态。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心4消息队列的其他典型使用消息队列的其他典型使用q紧耦合的单向数据通信:发送任务发送紧耦合的单向数据通信:发送任务发送消息后要求一个响应信号,说明接收任消息后要求一个响应信号,说明接收任务已经成功接收到消息。务已经成功接收到消息。 Task1Task2电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q紧耦合的双向

63、数据通信紧耦合的双向数据通信:如果数据需要:如果数据需要在任务之间双向流动,那么可以采用紧在任务之间双向流动,那么可以采用紧耦合的双向数据通信模式耦合的双向数据通信模式(也称为全双工也称为全双工通信通信)。Task1Task2电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第四节第四节事件事件1 概述2 事件机制的主要数据结构3 典型的事件操作4 事件机制的典型应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q事件是指一种说明预先定义的系统事件已经发事件是指一种说明预先定义的系统事件已经发生的机制。生的机制。q用于任务与任务之间、任务与用于任务与任务之间、任务与IS

64、R之间的同步。之间的同步。q主要的特点是可实现一对多的同步。主要的特点是可实现一对多的同步。q一个事件就是一个标志,不具备其它信息。一个事件就是一个标志,不具备其它信息。q一个或多个事件构成一个事件集。一个或多个事件构成一个事件集。q事件集可以用一个指定长度的变量事件集可以用一个指定长度的变量(比方一个比方一个8bit,16bit或或32bit的无符号整型变量,不同的的无符号整型变量,不同的操作系统其具体实现不一样操作系统其具体实现不一样)来表示,而每个来表示,而每个事件由在事件集变量中的某一位来代表。事件由在事件集变量中的某一位来代表。1概述概述电子科技大学嵌入式软件工程中心电子科技大学嵌入

65、式软件工程中心q事件及事件集有以下特点:事件及事件集有以下特点:q事件间相互独立。事件间相互独立。q事件仅用于同步,不提供数据传输功能。事件仅用于同步,不提供数据传输功能。q事件无队列事件无队列q屡次发送同一事件,在未经过任何处理的情况屡次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。下,其效果等同于只发送一次。q事件机制的意义在于:事件机制的意义在于:q当某任务要与多个任务或中断效劳同步时,就当某任务要与多个任务或中断效劳同步时,就需要使用事件机制。需要使用事件机制。q假设任务需要与一组事件中的任意一个发生同假设任务需要与一组事件中的任意一个发生同步,可称为独立型同步步,可

66、称为独立型同步(逻辑逻辑“或关系或关系)。q任务也可以等待假设干事件都发生时才同步,任务也可以等待假设干事件都发生时才同步,称为关联型同步称为关联型同步(逻辑逻辑“与关系与关系)。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心“ “或同步和或同步和或同步和或同步和“ “与同步与同步与同步与同步任务任务任务任务任务任务任务任务ISRISRORAND“与型同步与型同步“或型同步或型同步事件集事件集事件集事件集POSTPOSTPENDPEND电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心用多个事件的组合发信号给多个任务用多个事件的组合发信号给多个任务用多个事件的组合发信号

67、给多个任务用多个事件的组合发信号给多个任务任务任务任务任务任务任务ISRORAND事件集事件集事件集事件集事件集事件集8,16或或32位位POSTPENDPEND电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q术语:术语:q发送事件集发送事件集。指在一次发送过程中发往。指在一次发送过程中发往接收者接收者(比方任务比方任务)的一个或多个事件的的一个或多个事件的组合。组合。q待处理事件集。指已被发送到一个接收待处理事件集。指已被发送到一个接收者,正在等待处理的所有事件的集合。者,正在等待处理的所有事件的集合。q事件条件事件条件q“或同步:待处理事件集只要包括等或同步:待处理事件集只要

68、包括等待的任一事件即可满足要求;待的任一事件即可满足要求;q“与同步:待处理事件集必须包括等与同步:待处理事件集必须包括等待的全部事件方可满足要求。待的全部事件方可满足要求。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2事件机制的主要数据结构事件机制的主要数据结构q事件集控制块:管理所有创立的事件集事件集控制块:管理所有创立的事件集q或者或者q事件集附属于任务,不需创立,其相关事件集附属于任务,不需创立,其相关参数成为任务控制块的一局部。参数成为任务控制块的一局部。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心事件的内部实现机制实例说明事件的内部实现机制实例说明C

69、/OS-IIq事件标志组数据结构事件标志组数据结构typedefstructINT8UOSFlagType;/指示本数据结构的类型指示本数据结构的类型void*OSFlagWaitList;/等待事件标志的任务链表等待事件标志的任务链表OS_FLAGS OSFlagFlags;/各事件标志的当前状态各事件标志的当前状态OS_FLAG_GRP;q事件标志节点数据结构事件标志节点数据结构typedefstructvoid*OSFlagNodeNext;/后驱指针后驱指针void*OSFlagNodePrev;/前驱指针前驱指针void*OSFlagNodeTCB;/任务控制块指针任务控制块指针vo

70、id*OSFlagNodeFlagGrp;/指回指回OS_FLAG_GRP结构结构OS_FLAGS OSFlagNodeFlags;/所等待的事件标志组合所等待的事件标志组合INT8UOSFlagNodeWaitType;/等待类型等待类型(与、或与、或)OS_FLAG_NODE;电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心事件标志组、事件标志节点及任务控制块之间的关系事件标志组、事件标志节点及任务控制块之间的关系OS_FLAG_GRPOS_FLAG_NODE.OSTCBFlagNodeFlagGrp.OSFlagNodeFlags.OSFlagNodeWaitType.OSF

71、lagNodeNext.OSFlagNodePrev.OSFlagNodeTCB.OSFlagWaitList.OSFlagFlags.OSFlagTypeANDorORANDorORANDorOROS_EVENT_TYPE_FLAG00.OSTCBFlagNodeOS_TCB电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3典型的事件操作典型的事件操作q创立事件集创立事件集q删除事件集删除事件集q发送事件发送事件(集集)q接收事件接收事件(集集)q获取有关事件集的各种信息获取有关事件集的各种信息电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3.1创立事件集创立事件集

72、q申请申请空闲事件集控制块空闲事件集控制块,设置事件集属,设置事件集属性,初始化控制块中的域,分配性,初始化控制块中的域,分配ID号。号。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心创立一个事件标志组创立一个事件标志组OSFlagCreate()OS_FLAG_GRP*OSFlagCreate(OS_FLAGSflags,INT8U*err)OS_FLAG_GRP*pgrp;pgrp=OSFlagFreeList;/获取一个空闲事件标志组结构获取一个空闲事件标志组结构if(pgrp!=(OS_FLAG_GRP*)0)/获取成功,初始化该结构中的域获取成功,初始化该结构中的域OS

73、FlagFreeList=(OS_FLAG_GRP*)OSFlagFreeList-OSFlagWaitList;/调整空闲结构链头指针调整空闲结构链头指针pgrp-OSFlagType=OS_EVENT_TYPE_FLAG;pgrp-OSFlagFlags=flags;/初始化当前各事件标志的状态初始化当前各事件标志的状态pgrp-OSFlagWaitList=(void*)0;/尚无任务等待事件标志尚无任务等待事件标志*err=OS_NO_ERR;else*err=OS_FLAG_GRP_DEPLETED;return(pgrp);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中

74、心3.2接收事件接收事件(集集)在接收事件在接收事件(集集)时可以有如下选项时可以有如下选项WAITNO_WAIT接收事件(集)时可等待接收事件(集)时可等待接收事件(集)时不等待接收事件(集)时不等待接收者永远等待,直到事件接收者永远等待,直到事件条件被满足后成功返回;条件被满足后成功返回; 接收者根据指定的时限等待。接收者根据指定的时限等待。EVENT_ALLEVENT_ANY待处理事件集必须包含事件条件中的全部事件方可满足要求,待处理事件集必须包含事件条件中的全部事件方可满足要求,即按照即按照“与与”条件接收事件条件接收事件待处理事件集只要包含事件条件中的任一事件即可满足要求,待处理事件

75、集只要包含事件条件中的任一事件即可满足要求,即按照即按照“或或”条件接收事件条件接收事件电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心OS_FLAGSOSFlagPend(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uwait_type,INT16Utimeout,INT8U*err)OS_FLAG_NODEnode;/OS_FLAG_NODE作为局部变量存在于调用该函数的任务堆作为局部变量存在于调用该函数的任务堆栈中栈中OS_FLAGSflags_cur;OS_FLAGSflags_rdy;switch(wait_type)caseOS_FLAG_WA

76、IT_SET_ALL:/任务以任务以“与方式等待事件标志与方式等待事件标志flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy=flags)/事件标志当前状态与等待条件相符事件标志当前状态与等待条件相符pgrp-OSFlagFlags&=flags_rdy;/去除即去除即“消费满消费满足条件的事件标志足条件的事件标志flags_cur=pgrp-OSFlagFlags;*err=OS_NO_ERR;return(flags_cur);/返回处理后的事件标志组返回处理后的事件标志组elseOS_FlagBlock(pgrp,&node,flags,wait_

77、type,timeout);/事件标志当前状态与等待条件不相符,任务被阻塞事件标志当前状态与等待条件不相符,任务被阻塞break;接收接收(等待等待)事件标志组的事件标志位事件标志组的事件标志位OSFlagPend()电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心caseOS_FLAG_WAIT_SET_ANY:/任务以任务以“或方式等待事件标志或方式等待事件标志flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy!=(OS_FLAGS)0)/有满足条件的事件标志有满足条件的事件标志pgrp-OSFlagFlags&=flags_rdy;/去

78、除即去除即“消费消费满足条件的事件标志满足条件的事件标志flags_cur=pgrp-OSFlagFlags;*err=OS_NO_ERR;return(flags_cur);/返回处理后的事件标志组返回处理后的事件标志组elseOS_FlagBlock(pgrp,&node,flags,wait_type,timeout);/事件标志当前状态与等待条件不相符,任务被阻塞事件标志当前状态与等待条件不相符,任务被阻塞break;default:flags_cur=(OS_FLAGS)0;*err=OS_FLAG_ERR_WAIT_TYPE;return(flags_cur);电子科技大学嵌入式软

79、件工程中心电子科技大学嵌入式软件工程中心OS_Sched();/当前任务被放到事件标志等待链后,内核实施任务调度当前任务被放到事件标志等待链后,内核实施任务调度if(OSTCBCur-OSTCBStat&OS_STAT_FLAG)/判断任务重新就绪的原因,如果判断任务重新就绪的原因,如果是等待超时是等待超时OS_FlagUnlink(&node);/将任务从事件标志等待链中解除下来将任务从事件标志等待链中解除下来OSTCBCur-OSTCBStat=OS_STAT_RDY;/设置当前任务状态为就绪设置当前任务状态为就绪flags_cur=(OS_FLAGS)0;/无效的事件标志状态无效的事件标

80、志状态*err=OS_TIMEOUT;/超时信号超时信号else/任务重新就绪的原因是在限定时间得到了满足条件的事件标志任务重新就绪的原因是在限定时间得到了满足条件的事件标志pgrp-OSFlagFlags&=OSTCBCur-OSTCBFlagsRdy;/去除即去除即“消费消费满足条件的事件标志满足条件的事件标志flags_cur=pgrp-OSFlagFlags;*err=OS_NO_ERR;return(flags_cur);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心OS_FLAG_GRPOS_EVENT_TYPE_FLAGANDorORANDorOR00OS_TCBO

81、S_TCBOSTCBCurANDorOROS_FLAG_NODEOS_FLAG_NODE0添加一个任务到事件标志组等待任务链表中添加一个任务到事件标志组等待任务链表中OS_FlagBlock()电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心OS_FLAGSOSFlagAccept(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uwait_type,INT8U*err)OS_FLAGSflags_cur,flags_rdy;*err=OS_NO_ERR;switch(wait_type)/判断等待事件标志的方式判断等待事件标志的方式caseOS_FLAG_W

82、AIT_SET_ALL:/与方式等待与方式等待flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy=flags)pgrp-OSFlagFlags&=flags_rdy;/事件标志当事件标志当前状态与等待条件相符,去除即前状态与等待条件相符,去除即“消费相应的事件标志消费相应的事件标志else*err=OS_FLAG_ERR_NOT_RDY;/不符合条件,返回错误信息不符合条件,返回错误信息flags_cur=pgrp-OSFlagFlags;break;接收接收(无等待地获取无等待地获取)事件标志事件标志OSFlagAccept()电子科技大学嵌入式软件工

83、程中心电子科技大学嵌入式软件工程中心caseOS_FLAG_WAIT_SET_ANY:/或方式等待或方式等待flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy!=(OS_FLAGS)0)pgrp-OSFlagFlags&=flags_rdy;/事件标志当前状态与等待条事件标志当前状态与等待条件相符,去除即件相符,去除即“消费相应的事件标志消费相应的事件标志else*err=OS_FLAG_ERR_NOT_RDY;/不符合条件,返回错误信息不符合条件,返回错误信息flags_cur=pgrp-OSFlagFlags;break;default:flags_

84、cur=(OS_FLAGS)0;/0表示无效的事件标志组表示无效的事件标志组*err=OS_FLAG_ERR_WAIT_TYPE;/错误的等待类型错误的等待类型break;return(flags_cur);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3.3发送事件发送事件(集集)q调用者调用者(任务或中断任务或中断)构造一个事件构造一个事件(集集),将其,将其发往接收者发往接收者(比方目标任务比方目标任务)。可能会出现以下。可能会出现以下几种情况之一:几种情况之一:q目标任务正在等待的事件条件得到满足,任务目标任务正在等待的事件条件得到满足,任务就绪;就绪;q目标任务正在等待

85、的事件条件没有得到满足,目标任务正在等待的事件条件没有得到满足,该事件该事件(集集)被按被按“或操作,保存到目标任务或操作,保存到目标任务的待处理事件集中,目标任务继续等待;的待处理事件集中,目标任务继续等待;q目标任务未等待事件目标任务未等待事件(集集),该事件,该事件(集集)被按被按“或操作,保存到目标任务的待处理事件集中。或操作,保存到目标任务的待处理事件集中。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心OS_FLAGSOSFlagPost(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8U*err)OS_FLAG_NODE*pnode;BOOLEA

86、Nsched=FALSE;/初始化调度标志初始化调度标志OS_FLAGSflags_cur,flags_rdy;pgrp-OSFlagFlags|=flags;/置位事件标志置位事件标志pnode=(OS_FLAG_NODE*)pgrp-OSFlagWaitList;/获取任务等待链头节点获取任务等待链头节点while(pnode!=(OS_FLAG_NODE*)0)/如果有任务等待,遍历等待链如果有任务等待,遍历等待链switch(pnode-OSFlagNodeWaitType)caseOS_FLAG_WAIT_SET_ALL:/与方式等待与方式等待flags_rdy=pgrp-OSFla

87、gFlags&pnode-OSFlagNodeFlags;if(flags_rdy=pnode-OSFlagNodeFlags)/符合等待条件符合等待条件if(OS_FlagTaskRdy(pnode,flags_rdy)=TRUE)sched=TRUE;/如果任务就绪,设置调度标志如果任务就绪,设置调度标志break;发送发送(置位置位)事件标志组中的事件标志事件标志组中的事件标志OSFlagPost()电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心caseOS_FLAG_WAIT_SET_ANY:/或方式等待或方式等待flags_rdy=pgrp-OSFlagFlags&pn

88、ode-OSFlagNodeFlags;if(flags_rdy!=(OS_FLAGS)0)/有满足条件的事件标志有满足条件的事件标志if(OS_FlagTaskRdy(pnode,flags_rdy)=TRUE)sched=TRUE;/如果任务就绪,设置调度标志如果任务就绪,设置调度标志break;pnode=(OS_FLAG_NODE*)pnode-OSFlagNodeNext;/下一个等待事件标下一个等待事件标志的节点志的节点if(sched=TRUE)OS_Sched();/如果设置了调度标志,那么实施调度如果设置了调度标志,那么实施调度*err=OS_NO_ERR;return(pg

89、rp-OSFlagFlags);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3.4删除删除事件集事件集q回收事件集控制块到空闲链中,等待接回收事件集控制块到空闲链中,等待接收该事件集的任务被恢复就绪。收该事件集的任务被恢复就绪。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心删除事件标志组删除事件标志组OSFlagDel()OS_FLAG_GRP*OSFlagDel(OS_FLAG_GRP*pgrp,INT8Uopt,INT8U*err)BOOLEANtasks_waiting;OS_FLAG_NODE*pnode;if(pgrp-OSFlagWaitList!=(

90、void*)0)tasks_waiting=TRUE;/有任务等待有任务等待elsetasks_waiting=FALSE;/无任务等待无任务等待switch(opt)caseOS_DEL_NO_PEND:/在无任务等待时才删除事件标志组在无任务等待时才删除事件标志组if(tasks_waiting=FALSE)/无任务等待,释放控制块到空闲链中无任务等待,释放控制块到空闲链中pgrp-OSFlagType=OS_EVENT_TYPE_UNUSED;pgrp-OSFlagWaitList=(void*)OSFlagFreeList;OSFlagFreeList=pgrp;*err=OS_NO_

91、ERR;return(OS_FLAG_GRP*)0);else/有任务等待,删除失败有任务等待,删除失败*err=OS_ERR_TASK_WAITING;return(pgrp);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心caseOS_DEL_ALWAYS:/无论是否有任务等待,都删除事件标志组无论是否有任务等待,都删除事件标志组pnode=(OS_FLAG_NODE*)pgrp-OSFlagWaitList;/获取等待头节点获取等待头节点while(pnode!=(OS_FLAG_NODE*)0)/遍历整个等待任务链,使每个等遍历整个等待任务链,使每个等待任务就绪待任务就绪

92、OS_FlagTaskRdy(pnode,(OS_FLAGS)0);pnode=(OS_FLAG_NODE*)pnode-OSFlagNodeNext;pgrp-OSFlagType=OS_EVENT_TYPE_UNUSED;pgrp-OSFlagWaitList=(void*)OSFlagFreeList;OSFlagFreeList=pgrp;/释放控制块回空闲链释放控制块回空闲链if(tasks_waiting=TRUE)OS_Sched();/如果之前有任务等待,如果之前有任务等待,*err=OS_NO_ERR;内核实施调度内核实施调度return(OS_FLAG_GRP*)0);de

93、fault:*err=OS_ERR_INVALID_OPT;return(pgrp);电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第五节第五节异步信号异步信号1 概述2 异步信号机制与中断机制的比较3 异步信号机制与事件机制的比较4 异步信号机制的主要数据结构5 典型的异步信号操作电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q用于任务与任务之间、任务与用于任务与任务之间、任务与ISR之间的异步操作:之间的异步操作:q任务任务(或或ISR)用来通知其它任务某个事件的出现。用来通知其它任务某个事件的出现。q需要处理异步信号的任务由两局部组成:需要处理异步信号的任务由

94、两局部组成:q与异步信号无关的任务主体与异步信号无关的任务主体qASR(异步信号效劳例程异步信号效劳例程)q一个一个ASR对应于一个任务。对应于一个任务。q当向任务发送一个异步信号,如果该任务正在运当向任务发送一个异步信号,如果该任务正在运行那么中止其自身代码的运行,转而运行与该异行那么中止其自身代码的运行,转而运行与该异步信号相关的效劳例程;步信号相关的效劳例程;q或者当该任务被激活时,在投入运行前执行或者当该任务被激活时,在投入运行前执行ASR。q异步信号机制也可以称作软中断机制,异步信号异步信号机制也可以称作软中断机制,异步信号又被称为软中断信号。又被称为软中断信号。1概述概述电子科技大

95、学嵌入式软件工程中心电子科技大学嵌入式软件工程中心Task1ISRTask2()使能异步信号;使能异步信号;Signal_routine()Return();100000异步信号标志异步信号标志电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2异步信号机制与中断机制的比较异步信号机制与中断机制的比较q相同点相同点q具有中断性。对中断的处理和对异步信号具有中断性。对中断的处理和对异步信号的处理都要先暂时地中断当前任务的运行。的处理都要先暂时地中断当前任务的运行。q有相应的效劳程序有相应的效劳程序q根据中断向量,有一段与中断信号对应的根据中断向量,有一段与中断信号对应的效劳程序,称为效

96、劳程序,称为ISR(InterruptServiceRoutine)。q根据异步信号的编号,有一段与之对应的根据异步信号的编号,有一段与之对应的效劳程序,称为效劳程序,称为ASR(AsynchroniousServiceRoutine)。q可以屏蔽其响应可以屏蔽其响应q外部硬件中断可以通过相应的存放器操作外部硬件中断可以通过相应的存放器操作被屏蔽。被屏蔽。q任务也可屏蔽对异步信号的响应。任务也可屏蔽对异步信号的响应。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q不同点不同点v实质不同中断由中断由硬件或者特定的指令硬件或者特定的指令产生,不受任务调产生,不受任务调度的控制度的控制

97、异步信号由异步信号由系统调用系统调用(使用发送异步信号功能使用发送异步信号功能)产生,受到任务调度的控制产生,受到任务调度的控制v处理时机(或响应时间)不同v中断触发后,硬件根据中断向量找到相应的效劳程序执行。在退出中断效劳程序之前会进行重调度,所以中断结束后运行的任务不一定是先前被中断的任务。v异步信号通过发送异步信号的系统调用触发,但是系统不一定马上开始对它的处理:v如果接收异步信号的不是当前任务,那么ASR要等到接收任务被调度、完成上下文切换后才能执行,之后再执行任务自身的代码。v任务也可以给自己发送异步信号,在这种情况下,其ASR将马上执行。v执行的环境不同v一般地,ISR在独立的上下

98、文中运行,操作系统为之提供专门的堆栈空间。vASR在相关任务的上下文中运行,所以ASR也是任务的一个组成局部。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3异步信号机制与事件机制的比较异步信号机制与事件机制的比较q同样是标志着某个事件的发生,事件机制同样是标志着某个事件的发生,事件机制的使用是同步的,而异步信号机制是异步的使用是同步的,而异步信号机制是异步的。的。q对一个任务来说,什么时候会接收到事件对一个任务来说,什么时候会接收到事件是的,因为接收事件的功能是它自己在运是的,因为接收事件的功能是它自己在运行过程中调用的。行过程中调用的。q任务不能预知何时会收到一个异步信号,任

99、务不能预知何时会收到一个异步信号,并且一旦接收到了异步信号,在允许响应并且一旦接收到了异步信号,在允许响应的情况下,它会中断正在运行的代码而去的情况下,它会中断正在运行的代码而去执行异步信号处理程序。执行异步信号处理程序。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心4异步信号机制的主要数据结构异步信号机制的主要数据结构q一种异步信号控制结构一种异步信号控制结构Asynchronous_Signal_Control_Blockvenabled是否使能对异步信号的响应是否使能对异步信号的响应vhandler处理例程处理例程vattribute_setASR的执行属性的执行属性vsi

100、gnals_posted使能响应时,已发送但尚未处理使能响应时,已发送但尚未处理的信号的信号vsignals_pending屏蔽响应时,已发送但尚未处理屏蔽响应时,已发送但尚未处理的信号的信号vnest_levelASR中异步信号的嵌套层数中异步信号的嵌套层数电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心qASR的执行属性的执行属性v是否允许任务在执行是否允许任务在执行ASR过程中被抢占。过程中被抢占。v是否允许时间片切换。是否允许时间片切换。v是否支持是否支持ASR嵌套。嵌套。v是否允许在执行是否允许在执行ASR过程中响应中断。过程中响应中断。电子科技大学嵌入式软件工程中心电子

101、科技大学嵌入式软件工程中心5典型的异步信号操作典型的异步信号操作q安装异步信号处理例程安装异步信号处理例程q发送异步信号到任务发送异步信号到任务 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心5.1安装异步信号处理例程安装异步信号处理例程q为任务安装一个异步信号处理例程为任务安装一个异步信号处理例程(ASR)。q仅当任务已建立了仅当任务已建立了ASR,才允许向该任,才允许向该任务发送异步信号,否那么发送的异步信务发送异步信号,否那么发送的异步信号无效。号无效。q当任务的当任务的ASR无效时,发送到任务的异无效时,发送到任务的异步信号将被丢弃。步信号将被丢弃。q调用者需指定调用者需

102、指定ASR的入口地址和执行属的入口地址和执行属性。性。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心异步信号处理例程的一般形式异步信号处理例程的一般形式voidhandler(signal_set)switch(signal_set)CASESIGNAL_1:动作动作1;break;CASESIGNAL_2:动作动作2;break;signal_set参数为任务接收到的异步信号集。参数为任务接收到的异步信号集。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心5.2发送异步信号到任务发送异步信号到任务q发送异步信号给任务对接收任务的执行状态发送异步信号给任务对接收任务的

103、执行状态没有任何影响。没有任何影响。q在目标任务已经安装了异步信号处理例程的在目标任务已经安装了异步信号处理例程的情况下,如果目标任务不是当前执行任务,情况下,如果目标任务不是当前执行任务,那么发送给它的异步信号就会等下一次该任那么发送给它的异步信号就会等下一次该任务占有处理器时再由相应的务占有处理器时再由相应的ASR处理,任务处理,任务获得处理器后,将首先执行获得处理器后,将首先执行ASR。q如果当前运行的任务发送异步信号给自己或如果当前运行的任务发送异步信号给自己或收到来自中断的异步信号,在允许收到来自中断的异步信号,在允许ASR处理处理的前提下,它的的前提下,它的ASR会立即执行。会立即

104、执行。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第六节第六节管道管道1 概述2 管道机制的主要数据结构3 典型的管道操作4 管道机制的典型应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心1管道管道机制概述机制概述q管道管道(pipe)是提供是提供非结构化数据非结构化数据交换和交换和实现任务间同步的内核对象。实现任务间同步的内核对象。q在传统的实现中,管道是单向数据交换在传统的实现中,管道是单向数据交换设施。设施。Task1Task2管道管道管道中的数据管道中的数据写描述符写描述符读描述符读描述符向管道向管道写数据写数据从管道从管道读数据读数据数据在管道内像一个

105、非结构字节流,按数据在管道内像一个非结构字节流,按FIFO的次序从管道的次序从管道中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q管道允许有多个读者和写者。管道允许有多个读者和写者。 Task1Task5管道管道Task2Task3Task4Task6ISR1ISR2ISR3公共管道操作公共管道操作电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q管道与消息队列的区别管道与消息队列的区别v管道不存储多个消息,它存储的数据是非管道不存储多个消息,它存储的数据是非结构化

106、的字节流;结构化的字节流;v管道中的数据严格地遵循先进先出的顺序;管道中的数据严格地遵循先进先出的顺序;v管道支持选择管道支持选择(select)操作,而消息队列不操作,而消息队列不支持。支持。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q管道的状态管道的状态非空非空满满创立管道创立管道无写入数无写入数据据读数据,有读数据,有剩余数据剩余数据空空写数据写数据读数据,读数据,无数据留无数据留下下写数据,有写数据,有剩余空间剩余空间读数据读数据写数据,无写数据,无剩余空间剩余空间电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q命名管道和无名管道:命名管道和无名管道:q

107、一个命名管道具有一个类似于文件名的一个命名管道具有一个类似于文件名的名字,并像一个文件或设备出现在文件名字,并像一个文件或设备出现在文件中。中。q任务或任务或ISR可以用名字对其进行引用。可以用名字对其进行引用。q无名管道无名管道q没有名字且不在文件系统中出现没有名字且不在文件系统中出现q必须使用创立管道时系统返回调用者的必须使用创立管道时系统返回调用者的描述符才能引用描述符才能引用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心2管道机制的主要数据结构管道机制的主要数据结构管道控制块管道控制块Byte countData bufferBuffer sizeOutput posit

108、ionInput positionTask3Task4接收任务等待列表接收任务等待列表Task1Task2发送任务等待列表发送任务等待列表电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心3典型典型的管道操作的管道操作q创立和删除一个管道;创立和删除一个管道;q读或写管道;读或写管道;q管道上的选择操作;管道上的选择操作;qFlush操作。操作。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q管道创立和删除管道创立和删除q创立管道的操作给调用者返回两个描述创立管道的操作给调用者返回两个描述符。符。q一个描述符只能用于写,而另一个只能一个描述符只能用于写,而另一个只能用于

109、读。用于读。q创立一个命名管道创立一个命名管道q与创立文件类似与创立文件类似q在命名管道建立之后,在文件系统中有在命名管道建立之后,在文件系统中有一个可识别的名字,可以使用一个可识别的名字,可以使用open操作操作翻开它翻开它q调用者也必须说明是采用读方式翻开还调用者也必须说明是采用读方式翻开还是写方式翻开是写方式翻开q与与open操作相对应,操作相对应,close操作用于关操作用于关闭并删除一个命名管道。闭并删除一个命名管道。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q管道读和写管道读和写q读操作把管道中的数据返回给调用者读操作把管道中的数据返回给调用者(任任务务)。任务应

110、指定读多少数据。任务应指定读多少数据。q如果指定的大小超过管道中可以得到的如果指定的大小超过管道中可以得到的数据量,那么任务可以选择阻塞,等待数据量,那么任务可以选择阻塞,等待剩余的数据到达。剩余的数据到达。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心q选择选择(Select)操作操作vSelect操作允许一个任务阻塞并等待一个或操作允许一个任务阻塞并等待一个或多个管道上的一个指定条件的发生。多个管道上的一个指定条件的发生。Task1ISRTask2Task3Pipe1Pipe2Pipe3任务任务Task3等待从等待从Pipe1和和Pipe2这这两个管道读数据并写到第三个管道两

111、个管道读数据并写到第三个管道Pipe3上。在这种情况下,当头两个上。在这种情况下,当头两个管道中的任意一个有数据时,管道中的任意一个有数据时,Select调用返回。调用返回。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心qFlush操作操作qFlush操作将所有的数据从管道中去除,操作将所有的数据从管道中去除,使管道回到最初创立的状态。使管道回到最初创立的状态。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心4 管道机制的典型应用管道机制的典型应用q主要用于任务到任务或主要用于任务到任务或ISR到任务的数据到任务的数据传输。传输。q也可用于任务之间的同步。也可用于任务之间的同步。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心TaskATaskBSelect操作操作Select操作操作管道管道C管道管道D任务任务A和任务和任务B翻开两个管道作为翻开两个管道作为任务间的通信方式:翻开管道任务间的通信方式:翻开管道C作作为从任务为从任务A到任务到任务B的数据传输,的数据传输,翻开管道翻开管道D作为从任务作为从任务B到任务到任务A的的回应。回应。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号