实时操作系统同步互斥与通信

上传人:痛*** 文档编号:181905455 上传时间:2023-01-18 格式:PPT 页数:134 大小:2.01MB
收藏 版权申诉 举报 下载
实时操作系统同步互斥与通信_第1页
第1页 / 共134页
实时操作系统同步互斥与通信_第2页
第2页 / 共134页
实时操作系统同步互斥与通信_第3页
第3页 / 共134页
资源描述:

《实时操作系统同步互斥与通信》由会员分享,可在线阅读,更多相关《实时操作系统同步互斥与通信(134页珍藏版)》请在装配图网上搜索。

1、嵌入式实时操作系统及应用开发第六章 同步、互斥与通信主要内容概述信号量邮箱和消息队列管道事件 并发的进程之间的协作包括如下类型:进程互斥 多个进程不能同时使用同一个资源,某个进程使用该资源时,其他进程必须等待。保证各个进程不同时进入临界区,有效访问临界资源。进程同步 多个进程的调用存在时序关系,某些进程的执行必须先于另一些进程。保证进程运行的合理顺。进程通信 多个进程之间传递消息。互斥和同步是进程并发的两个要素概述ISR xTask yPOSTPENDTask xTask yPOSTPENDPOSTPENDTask xTask yPOSTPEND概述进程互斥与同步考虑下面一个字符回显的的过程考

2、虑下面一个字符回显的的过程 void echo()chin=getchar();chout=chin;putchar(chout);从键盘获得输入,每击一下键,输入字符就保存在变量从键盘获得输入,每击一下键,输入字符就保存在变量chin中,然后传送给变量中,然后传送给变量chout,并回送显示器,并回送显示器任何程序可以重复地调用此过程,接收用户输入,并在用户的任何程序可以重复地调用此过程,接收用户输入,并在用户的屏幕上显示屏幕上显示考虑一个支持单用户单处理器、多道程序设计系统考虑一个支持单用户单处理器、多道程序设计系统将其当作一个共享过程,载入到所有应用程序公用的全局将其当作一个共享过程,载

3、入到所有应用程序公用的全局存储区中。这样每个应用程序都能使用这个过程,由于每存储区中。这样每个应用程序都能使用这个过程,由于每个应用程序只需使用个应用程序只需使用echoecho过程的一个副本,从而节省空间过程的一个副本,从而节省空间进程间共享主存是非常有用的,它允许进程间有效而紧进程间共享主存是非常有用的,它允许进程间有效而紧密的交互,有利于进程的相互通信。但是,共享也可能密的交互,有利于进程的相互通信。但是,共享也可能会带来一些问题会带来一些问题进程互斥与同步 P1P2XXYYY YP1P2唤 醒在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号量(semapho

4、re),用于互斥与同步事件(组)(event group),用于同步异步信号(asynchronous signal),用于同步邮箱(mailbox)、消息队列(message queue),用于消息通信管道(pipe),提供非结构化数据交换和实现同步 概述忙等待模型 持续检查一个变量,直到它可用为止睡眠-唤醒模型 通过PV原语操作保证进程间的互斥消息传递模型 通过消息传送系统实现多进程之间的互斥进程互斥和同步的经典解决机制第一节信号量信号量的种类及用途信号量的种类及用途信号量的定义信号量的定义互斥信号量互斥信号量二值信号量二值信号量计数信号量计数信号量信号量机制的主要数据结构信号量机制的主要

5、数据结构典型的信号量操作典型的信号量操作临界资源和临界区操作系统把一次仅允许一个进程使用的资源称为临界资源。一个进程中访问临界资源的那段程序称为临界区。进程进程P1和和P2共享同一打印机资源,其操作流程共享同一打印机资源,其操作流程如下:如下:p1:entry codep1:entry code使用打印机使用打印机exit codeexit code p2:entry code p2:entry code使用打印机使用打印机exit codeexit code系统打印机即为系统打印机即为临界资源临界资源P1和和p2的访问临界资源打印机的代码即为的访问临界资源打印机的代码即为临界区临界区临界资源

6、和临界区临界区临界资源 进程P1 进程P2 R1 count;R2=count;R1+;R2+;count=R1;count=R2;(设count的初始值为5)为互斥地使用临界资源,需保证进程互斥地进入临界区。临界资源和临界区临界区的进入准则空闲让进:临界资源空闲时,允许进程进入临界区忙着等待:临界资源正在被访问时,其他需要进入临界区的进程必须等待有限等待:保证进程在有效的时间内进入临界区,避免“死等”让权等待:当进程不能进入临界区时,应立即释放处理机,以免其它进程“忙等”临界资源和临界区进程互斥进入临界区的实现方法硬件方法禁止中断在进程进入临界区之后,禁止该进程中断专用机器指令TS指令,Sw

7、ap指令软件方法信号量和PV操作临界资源和临界区信号量是一个数据结构,其定义如下:struct semaphore int value;struct PCB *queue;信号量semaphore包括一个整型值和一个等待队列。信号量只能通过P原语和V原语访问。什么是信号量什么是信号量信号量被定义为一个整形变量,在其上定义了以下三个操作:1、可以被初始化一个非负数2、wait操作(P操作)将信号量的值减1后,若该值为负,则执行wait操作的任务等待3、signal操作(V操作)将信号量的值增1后,若该值为非正,则执行signal操作的任务唤醒 P 原语 P(S)S:=S-1;如果 S =0,则表

8、示有资源,该进程继续执行;如果 S 0S=S-1返回返回调用进程进入等待队列调用进程进入等待队列转进程调度转进程调度是否P原语操作原型 void wait(semaphore s)/s.value=s.value 1;if(s.value 0,则该进程继续执行如果 S 0,说明有进程被挂起,则唤醒一阻塞进程,即从S信号量的等待队列首摘下一个PCB,将其置为就绪状态,执行 V(S)者继续执行6P操作可能会引起进程的阻塞,V操作不会引起本身进程状态的变化,但可能唤醒其他进程,使其从阻塞状态转变到就绪状态V原语V原语(1)若信号量S的等待队列中有等待进程,则取队首进程,将其置为就绪状态并返回。(2)

9、否则信号量S加1,并放回V原语原语是否有等待进程是否有等待进程S=S+1返回返回取队首进程置为就绪态取队首进程置为就绪态否是V原语操作原型 void signal(semaphore s)s.value=s.value+1;if(s.value=1)value=value 1;count=value;/打印一张机票;else /显示机票已售完;V(mutex);临界区信号量实现进程互斥用信号量实现任务间的互斥var mutex:Shared Semaphore;begin mutex:=1;parbegin P1:P2:Pi:repeat Wait(mutex);“进程Pi的临界代码段”;Si

10、gnal(mutex);forever Pn:parend endTask1Task2共享资源共享资源互斥信号量 WaitB(S):/申请信号量申请信号量if S.value1;/当前没有其他任务使用信号量当前没有其他任务使用信号量 then S.value=S.value-1=0/将信号量值修改为将信号量值修改为0,独占共享资源,独占共享资源else begin Insert(CALLER,S.L);/如果当前有其他任务使用信号量,将该任务放入等待如果当前有其他任务使用信号量,将该任务放入等待 队列队列 Block(CALLER);/修改该任务的状态为等待态(阻塞任务)修改该任务的状态为等待

11、态(阻塞任务)endSignalB(S):/释放信号量释放信号量if S.L queue is empty;/如果等待序列为空,没有其他任务等待使用该共享资如果等待序列为空,没有其他任务等待使用该共享资源源 then S.value=1;/释放信号量释放信号量else begin Remove(S.L,id);/如果有其他任务等待使用该共享资源,则从等待队列中如果有其他任务等待使用该共享资源,则从等待队列中 将该任务移除将该任务移除 wakeup(id);/将该任务的状态改为就绪态将该任务的状态改为就绪态(唤醒任务唤醒任务)end互斥信号量状态图互斥信号量状态图互斥信号量状态图开启开启锁定锁定

12、初始化初始化值为值为1申请并获得申请并获得值为值为0释放释放值为值为1申请申请(递归递归)并获得并获得锁定数加锁定数加1释放释放(递归递归)锁定数减锁定数减1各种互斥机制比较比较项目比较项目关中断关中断使用测试并置使用测试并置位指令位指令禁止任务禁止任务切换切换使用信号量使用信号量锁定范围锁定范围互斥力度最强互斥力度最强,锁定所有外部可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行凡是使用该指令访问共享资源的代码所有的任务只影响竞争共只影响竞争共享资源的任务享资源的任务对系统响应时对系统响应时间的影响间的影响如果关中断的时间较长,对系统的响应性能有很大影响较小

13、如果禁止切换的时间过长,则影响系统的响应性能对系统响应性能有对系统响应性能有一定影响,可能导一定影响,可能导致优先级反转致优先级反转实现时的系统实现时的系统开销开销小小小较大较大注意事项注意事项关中断时间要关中断时间要尽量短尽量短不是所有的处理器不是所有的处理器都具备这种指令,都具备这种指令,影响可移植性影响可移植性关调度的时间关调度的时间要尽量短要尽量短需采用一定的需采用一定的策略解决优先策略解决优先级反转问题级反转问题二值信号量可获得可获得不可获得不可获得申请并获得申请并获得(值为值为0)释放释放(值为值为1)初始化初始化值为值为0二值信号量状态图二值信号量状态图例如:有两个程序段S1和S

14、2,要求S1先于S2执行。semaphore mutex=0;P1进程:S1;V(mutex);/唤醒进程P2;P2进程:P(mutex);/等待P1执行;S2;二值信号量实现同步 Task1()执行一些操作执行一些操作;将信号量将信号量sem1置置1;申请信号量申请信号量sem2;Task2()申请信号量申请信号量sem1;执行一些操作执行一些操作;将信号量将信号量sem2置置1;Task2申请信号量申请信号量sem1失败,系统失败,系统切换到切换到Task1s e m 1 被 置被 置 1 后,后,Task2得到得到sem1并并抢占抢占Task1Task2运行到某处时因某种运行到某处时因某

15、种原因被阻塞,系统切换到原因被阻塞,系统切换到Task1二值信号量实现同步 计数信号量Task1Task2共享资源实例共享资源实例nTask m共享资源实例共享资源实例1计数信号量计数信号量状态图计数信号量状态图可获得可获得不可获得不可获得初始化初始化值大于值大于0申请并获得申请并获得值为值为0释放释放值为值为1申请并获得申请并获得值减值减1释放释放值加值加1计数(一般)信号量同步原语Wait(S):S.value:=S.value-1;/有新任务来使用共享资源将信号量的值减1 if S.value0 /如果信号量的值为负,表示共享资源已经分配完毕 then begin Insert(CALL

16、ER,S.L);/将该任务插入等待序列 Block(CALLER);/将该任务状态改为等待态(阻塞任务)endSignal(S):S.value:=S.value+1;/任务使用完共享资源,将信号量的值加1,释放 一个信号量 if S.value 1 then V(entry);P(wait);else V(entry);V(barber);“Shave”P(entry);count:=count 1;if count 0 then V(wait);V(entry);理发师理发师理发师barber信号量队列wait信号量队列entry信号量队列P(entry)count=5V(entry)P(

17、entry)count=5count=4V(entry)V(wait)V(barber)信号量机制的主要数据结构SCB1SCB2信号量控制块信号量控制块count信号量名字或信号量名字或IDTask1Task2任务等待列表任务等待列表信号量机制的主要数据结构信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue任务等待队列任务等待队列attributes信号量属性信号量属性lock_nesting_behavior 试图嵌套获得时的规则试图嵌套获得时的规则 wai

18、t_discipline 任务等待信号量的方式任务等待信号量的方式priority_ceiling 优先级天花板值优先级天花板值lock是否被占有是否被占有holder拥有者拥有者 nest_count嵌套层数嵌套层数计数信号量控制结构Counting_Semaphore_Control_Block wait_queue任务等待队列任务等待队列 attributes计数信号量属性计数信号量属性 maximum_count 最大计数值最大计数值 wait_discipline任务等待信号量的方式任务等待信号量的方式 count当前计数值当前计数值信号量机制的主要数据结构典型的信号量操作创建信号量

19、获取(申请)信号量释放信号量删除信号量清除信号量的任务等待列表 获取有关信号量的各种信息 创建信号量功能:根据应用传递的参数创建一个信号量参数:信号量的名字、属性和初始值等。内核动作:从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。创建成功时,为其分配唯一的ID号返回给应用。如果已创建信号量数量已达到用户配置的最大数量,就返回错误。信号量的属性信信号号量量的的属属性性信号量的类型互斥信号量(互斥信号量(MUTEX_SEMAPHORE)计数信号量(计数信号量(COUNTING_SEMAPHORE)二值信号量(二值信号量(BINARY_SEMAPHORE)任务等待信号量的方式先进先

20、出(先进先出(FIFO)顺序)顺序优先级(优先级(PRIORITY)顺序)顺序优先级反转问题的解决方法(只适用于互斥信号量)优先级继承算法(优先级继承算法(INHERIT_PRIORITY)优先级天花板算法优先级天花板算法(PRIORITY_CEILING),需,需给出所有可能获得此信号量的任务中优先级最给出所有可能获得此信号量的任务中优先级最高的任务的优先级。高的任务的优先级。获取(申请)信号量功能:试图获得应用指定的信号量。该功能流程如下:if 信号量的值大于0then 将信号量的值减1else 根据接收信号量的选项,将任务放到等待 队列中,或是直接返回获取(申请)信号量当所申请的信号量不

21、能被立即获得时,可以有以下几种选择:永远等待 不等待,立即返回,并返回一个错误状态码指定等待时限(可有效避免死锁)注意:不允许在ISR中选择等待当任务选择等待时,将被按FIFO或优先级顺序放置在等待队列中释放信号量功能:释放一个应用指定的信号量。if 没有任务等待这个信号量then 信号量的值加1 else 将信号量分配给一个等待任务(将相应的任务 移出等待队列,使其就绪)如果使用了优先级继承或优先级天花板算法,那么执行该功能(系统调用)的任务的优先级将恢复到原来的高度。删除信号量功能:从系统中删除应用指定的一个信号量内核动作:将信号量控制块返还给系统删除信号量的不一定是创建信号量的任务如果有

22、任务正在等待获得该信号量,执行此功能将使所有等待这个信号量的任务回到就绪队列中,且返回一个状态码指示该信号量已被删除清除信号量的任务等待列表为了清除等待一个信号量的所有任务,某些内核支持Flush操作,以便释放信号量等待任务列表中的所有任务。当多个任务的执行必须在某些点相遇时,需要这样的机制。SignalTaskTask2 二值信号量二值信号量初值为初值为0FlushTask1Task3第二节邮箱和消息队列通信方式概述通信方式概述消息队列机制的主要数据结构消息队列机制的主要数据结构典型的消息队列操作典型的消息队列操作任务间的通信方式消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户

23、定义,其内容可以是实际的数据、数据块的指针或空。为了能高效率地实现进程通信,操作系统设计了多种高级通信原语send(A)原语和receive(A)原语消息send(A)(读取消息)原语send(A)原语用来发送消息,A是发送进程提供的发送区起始地址send(A)原语先申请一个消息缓冲区,然后把发送区的内容复制到消息缓冲区中。然后找到接收进程的PCB,把消息缓冲区连入接收进程的消息缓冲区队列中代码消息procedure send(A);bengin new(p);p.sptr=address of sends PCB;mov message to buffer p;find the receiv

24、es PCB;p(mutex);add the buffer p to the massage queue;v(sm);v(mutex);end;消息receive(A)(读取消息)原语receive(A)原语用来读取消息,A是接收进程提供的接收区起始地址receive(A)原语把消息缓冲区中的消息内容、消息长度以及发送进程的名字读取到接收区,然后把消息缓冲区从链表中去掉,并释放消息缓冲区如果没有消息可读取,则阻塞接收进程,直至消息发送来为止消息procedure receive(A)bengin P(Sm);p(mutex);move out a buffer F from the mess

25、age queue of the Receive;v(mutex);move senders name and text from buffer F to receiber;end;send发送区(消息)进程进程q qreceive接受区接受区(消息)(消息)hptrmutexsmsptrnptrtextsptrnulltextaddpnulltextpaddpnulltextpnptr消息消息通信的分类:直接通信方式 发送进程直接把消息发送到目标进程 Send(P,message)发送一个消息到任务P Receive(Q,message)从任务Q接收一个消息 间接通信方式,也叫信箱通信方式

26、进程间的通信需要通过作为某种共享数据结构的实体信箱。send(A,message)发送一个消息给邮箱A receive(A,message)从邮箱A接收一个消息消息、消息队列、邮箱消息、消息队列、邮箱内核一般提供以下邮箱服务:消息邮箱与信号量最大的区别:消息邮箱可以存放一条完整的内容信息,而用信号量进行行为同步时,只能提供同步时刻的信息,不能提供内容信息。如果邮箱内有消息,则任务将消息从邮箱中取走;如果邮箱内没有消息,则内核不将该任务挂起(ACCEPT),返回空指针。内核内核 POST内容初始化PENDACCEPT邮箱内消息的内容初始化,此时邮箱内是否有消息并不重要;等待有消息进入邮箱(PEN

27、D);将消息放入邮箱(POST);消息邮箱消息邮箱消息邮箱消息邮箱满满消息指针消息指针PCPC空空 一般来说,消息邮箱只有2种状态:即空状态(消息邮箱中没有消息)、满状态(消息邮箱中存放了消息)。消息邮箱的状态消息邮箱的状态消息邮箱满满消息邮箱PC空空发送消息指针发送消息指针1.向消息邮箱发送消息有任务在等待消息有任务在等待消息等待列表中最等待列表中最高优先级的任务高优先级的任务运行状态运行状态就绪状态就绪状态 任务优先级足够高PC 获得消息获得消息注意:如果发送消息指针是以广播的形式发送,那么所有等待此消息的任务都获得消息发送消息指针发送消息指针无任务在等待消息无任务在等待消息PCPC返回错

28、误码说明消息邮箱已满 操作成功PC发送失败OSMboxPost()对应以上3种情形消息邮箱消息邮箱消息邮箱满满空空2.从消息邮箱接收消息等待消息指针等待消息指针PCPC操作成功 延时等待消息延时等待消息延时中获得消息,操作成功 延时等待消息延时等待消息设定延时到,无消息,返回超时错误等待消息指针等待消息指针消息邮箱等待消息指针等待消息指针PC空空消息邮箱满满另一个任务(或中断服务程序)向消息邮箱发出消息 PCOSMboxPend()对应以上3种情形消息邮箱消息邮箱 消息队列就象一个类似于缓冲区的对象,通过消息队列任务和ISR发送和接收消息,实现数据的通信和同步。消息队列具有一定的容量,可以容纳

29、多条消息,因此可以看成是多个邮箱的组合。消息指针1消息指针3消息指针2任务任务1PC任务任务2PCPCPCPCPC消息指针3消息指针2消息指针3FIFO 消息队列消息指针1消息指针3消息指针2任务任务1PC任务任务2PCPCPCPCPC提高消息在队列中的优先级实现LIFO算法 LIFO消息队列消息队列消息队列等待消息的到来(PEND);将消息放入队列中去(POST);无等待取得消息,如果消息队列中有消息,则任务将消息从消息队列中取走;如果消息队列为空,则内核不将该任务挂起,返回空指针。内核一般提供以下消息队列服务:与信号量和邮箱相比,消息队列的最大优点就是通过缓冲的方式来传递多个消息,从而避免

30、了信息的丢失或混乱。内核内核 POST初始化PENDACCEPT消息队列初始化,队列初始化时总是清为空;消息队列消息队列 一般来说,消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态)。消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息队列消息指针消息指针消息指针消息队列消息队列空状态空状态正常状态正常状态满状态满状态消息队列消息队列消息队列状态图非空非空满满队列创建队列创建消息数为消息数为0消息队列状态图消息队列状态图消息发送消息发送消息数加消息数加1空空消息发送消息发送消息数为

31、消息数为1消息接收消息接收消息数为消息数为0消息接收消息接收消息数减消息数减1消息接收消息接收消息数减消息数减1消息发送消息发送消息数等于队列长度消息数等于队列长度消息队列机制的主要数据结构队列控制块队列控制块队列长度队列长度QCB1队列名或队列名或IDTask3Task4接收任务等待列接收任务等待列表表Task1Task2发送任务等待列发送任务等待列表表最大最大消息消息长度长度QCB2消息队列及其相关的参数和支持数据结构消息队列及其相关的参数和支持数据结构 发送消息指针发送消息指针1.向消息队列发送消息有任务在等待消息有任务在等待消息等待列表中最等待列表中最高优先级的任务高优先级的任务运行状

32、态运行状态就绪状态就绪状态 任务优先级足够高PC 获得消息获得消息注意:如果发送消息指针是以广播的形式发送,那么所有等待此消息的任务都获得消息 当任务向消息队列中发送消息时,它首先判断是否有任务在等待消息队列的消息。OSQPost()对应3种情形消息队列消息队列未未满满发送消息指针发送消息指针无任务在等待消息无任务在等待消息PC返回错误码说明消息队列已满 操作成功PC 如果没有任务在等待消息队列的消息,那么就会再判断消息队列当前是否已满。消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息队列消息队列发送失败已已满满OSQPost()对应3种情形消息队列

33、消息队列消息指针消息指针2.从消息队列接收消息消息指针消息指针消息指针任务等待消息任务等待消息PC消息队列 消息队列中已存在消息,通过内核服务将消息传递给等待消息的任务中优先级最高的任务,或最先进入等待消息任务列表的任务。操作成功运行状态运行状态就绪状态就绪状态 任务优先级足够高 获得消息获得消息OSQPend()对应3种情形消息队列消息队列 如果消息队列为空,则等待消息的任务被放入等待消息的任务列表中,直到有其它任务向消息队列发送消息后才能解除该等待状态或在超时的情况下运行。消息指针任务任务PC消息队列 延时等待消息延时等待消息延时中获得消息,操作成功任务等待消息任务等待消息运行状态运行状态

34、就绪状态就绪状态 任务优先级足够高获得消息获得消息PCOSQPend()对应3种情形消息队列消息队列 一般来说,OSQPend()函数允许用户定义一个最长的等待时间Timeout作为它的参数,这样可以避免该任务无休止地等待下去。消息队列 任务等待消息任务等待消息运行状态运行状态就绪状态就绪状态 任务优先级足够高延时延时Timeout等待消息等待消息设定延时到,无消息,返回超时错误 一直无消息一直无消息超时超时OSQPend()对应3种情形消息队列消息队列Sending TaskReceiving TaskMessage1Message1Message1发送任务的发送任务的内存区域内存区域消息队

35、列的消息队列的内存区域内存区域接收任务的接收任务的内存区域内存区域1st copy2nd copy发送和接收消息的消息拷贝和内存使用发送和接收消息的消息拷贝和内存使用这种消息传递方法效率低、占用空间大这种消息传递方法效率低、占用空间大一种效率更高的方式是传递消息指针一种效率更高的方式是传递消息指针消息的发送或接收的两种方法number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessageme

36、ssagemessagemessagemessagemessagemessagemessagemessagemax_message_count消息队列消息队列控制块控制块消息队列消息队列缓冲区缓冲区消息队列机制的主要数据结构消息队列的环形缓冲消息队列的环形缓冲消息队列机制的主要数据结构max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指针消息指针典型的消息队列操作创建消息队列发送普通消息发送紧急消息发送广播消息接收消息删除消息队列获取有关消息队列的各种信息 创建消息队列创建消息队列时,调用者可以指定

37、如下参数:消息的最大长度每个消息队列中最多的消息数消息队列的属性 任务等待消息时的排队方式:FIFO或PRIORITY系统为新创建的消息队列分配唯一的ID 发送消息Msg 3接收任务接收任务等待列表等待列表Msg 2Msg 1消息队列消息队列发送普通消息先进先出发送普通消息先进先出(FIFO)次序)次序Msg 3接收任务接收任务等待列表等待列表Msg 2Msg 1消息队列消息队列发送紧急消息后进先出发送紧急消息后进先出(LIFO)次序)次序接收消息Task 4High消息队列消息队列接收任务等待列表接收任务等待列表任务等待列表基于任务等待列表基于优先级的次序优先级的次序Task 2medium

38、Task 3mediumTask 1LowTask 4High消息队列消息队列接收任务等待列表接收任务等待列表任务等待列表先进先出任务等待列表先进先出(FIFO)次序)次序Task 2mediumTask 3mediumTask 1Low删除消息队列从系统中删除指定的消息队列,释放消息队列控制块及消息队列缓冲区。任何知道此消息队列ID号的代码都可以删除它。消息队列被删除后,所有等待从这个消息队列接收消息的任务得到一个错误信息表明消息队列已被删除都回到并回到就绪态。消息队列的其他典型使用紧耦合的单向数据通信:发送任务发送消息后要求一个响应信号,表明接收任务已经成功接收到消息。Task1Task2

39、 消息队列的其他典型使用紧耦合的双向数据通信:如果数据需要在任务之间双向流动,则可以采用紧耦合的双向数据通信模式(也称为全双工通信)。Task1Task2第三节管道概述概述管道机制的主要数据结构管道机制的主要数据结构典型的管道操作典型的管道操作管道机制的典型应用管道机制的典型应用管道机制概述管道(pipe)是提供非结构化数据交换和实现任务间同步的内核对象。在传统的实现中,管道是单向数据交换设施。Task1Task2管道管道管道中的数据管道中的数据写描述符写描述符读描述符读描述符向管道向管道写数据写数据从管道从管道读数据读数据数据在管道内像一个非结构字节流,按数据在管道内像一个非结构字节流,按F

40、IFOFIFO的次序从管道的次序从管道中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。管道机制概述管道允许有多个读者和写者。Task1Task5管道管道Task2Task3Task4Task6ISR1ISR2ISR3公共管道操作公共管道操作管道管道的状态转换图非空非空满满创建管道创建管道无写入数无写入数据据读数据,有读数据,有剩余数据剩余数据空空写数据写数据读数据,读数据,无数据留无数据留下下写数据,有写数据,有剩余空间剩余空间读数据读数据写数据,无写数据,无剩余空间剩余空间管道机制的主要数据结构管道控制块管道控制块Byte countD

41、ata bufferBuffer sizeOutput positionInput positionTask3Task4接收任务等待列表接收任务等待列表Task1Task2发送任务等待列表发送任务等待列表典型的管道操作选择(Select)操作 int select(int nfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,struct timeval*timeout);Select操作允许一个任务阻塞并等待一个或多个管道上的一个指定条件的发生。Task1ISRTask2Task3Pipe1Pipe2Pipe3任务任务Task3Task3等

42、待从等待从Pipe1Pipe1和和Pipe2Pipe2这两个管道读数这两个管道读数据并写到第三个管道据并写到第三个管道Pipe3Pipe3上。在这种情况下,上。在这种情况下,当头两个管道中的任意当头两个管道中的任意一个有数据时,一个有数据时,SelectSelect调用返回。调用返回。用来让程序监视多个文件描述符用来让程序监视多个文件描述符(ptor)的状态变化的的状态变化的管道机制的典型应用Task ATask BSelect操作操作Select操作操作管道管道C管道管道D任务任务A A和任务和任务B B打开两个打开两个管道作为任务间的通信管道作为任务间的通信方式:打开管道方式:打开管道C

43、C作为从作为从任务任务A A到任务到任务B B的数据传的数据传输,打开管道输,打开管道D D作为从任作为从任务务B B到任务到任务A A的回应。任的回应。任务务A A等待管道等待管道C C编程可写,编程可写,也等待管道也等待管道D D上来自任务上来自任务B B的回应。的回应。两个任务之间的同步管道主要用于任务到任务或管道主要用于任务到任务或ISRISR到任务的数据传输到任务的数据传输第四节事 件概述概述事件机制的主要数据结构事件机制的主要数据结构典型的事件操作典型的事件操作事件机制的典型应用事件机制的典型应用在嵌入式实时内核中,事件是指一种表明预先定义的系统事件已经发生的机制。事件机制用于任务

44、与任务之间、任务与ISR之间的同步。其主要的特点是可实现一对多的同步。一个事件就是一个标志,不具备其它信息。一个或多个事件构成一个事件集。事件集可以用一个指定长度的变量(比如一个8bit,16bit或32bit的无符号整型变量,不同的操作系统其具体实现不一样)来表示,而每个事件由在事件集变量中的某一位来代表。概述事件及事件集有以下特点:事件间相互独立事件仅用于同步,不提供数据传输功能事件无队列,即多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。提供事件机制的意义在于:当某任务要与多个任务或中断服务同步时,就需要使用事件机制。若任务需要与一组事件中的任意一个发生同步,可称为独

45、立型同步(逻辑“或”关系)。任务也可以等待若干事件都发生时才同步,称为关联型同步(逻辑“与”关系)。概述概述任务任务任务任务任务任务任务任务ISRISRORAND“与与”型同步型同步“或或”型同步型同步事件集事件集事件集事件集POSTPOSTPENDPEND概述任务任务任务任务任务任务ISRORAND事件集事件集事件集事件集事件集事件集(8,16或或32位)位)POSTPENDPEND术语:发送事件集。指在一次发送过程中发往接收者(比如任务)的一个或多个事件的组合。待处理事件集。指已被发送到一个接收者但还没有被接收(即正在等待处理)的所有事件的集合。事件条件。指事件接收者在一次接收过程中期待接

46、收的一个或多个事件的集合。“或”同步:待处理事件集只要包括事件条件中的任一事件即可满足要求;“与”同步:其二是待处理事件集必须包括事件条件中的全部事件方可满足要求。概述事件机制的主要数据结构(1)事件集控制块结构(Event_set_Control_Block):attribute 事件集的属性(排队方式:FIFO或PRIORITY)event_set 当前事件集(指示被置位且未被接受的事件标志位)eventset_condition_queue_and 事件集”与”等待队列 eventset_condition_queue_or 事件集”或”等待队列 内核为每个等待事件集的任务生成一个“任务

47、事件集等待控制块”(2)任务事件集等待控制块结构(Event_set_Task_Waited_Buddy)task 等待任务的控制块指针 event_set 任务当前等待的事件集 flag_node_array 任务等待标志节点数组 任务等待标志节点数组的长度等于事件集的位数,其中每个节点元素对应一个 等待的事件标志典型的事件操作创建事件集删除事件集发送事件(集)接收事件(集)获取有关事件集的各种信息 创建事件集、删除事件集创建事件集:申请空闲事件集控制块,设置事件集属性,初始化控制块中的域(当前事件集、“与”/“或”等待队列),分配ID号删除事件集:回收事件集控制块到空闲链中,等待接收该事件

48、集的任务被恢复就绪发送事件(集)调用者(任务或中断)构造一个事件(集),将其发往接收者(比如目标任务)。可能会出现以下几种情况之一:目标任务正在等待的事件条件得到满足,任务就绪;目标任务正在等待的事件条件没有得到满足,该事件(集)被按“或”操作,保存到目标任务的待处理事件集中,目标任务继续等待;目标任务未等待事件(集),该事件(集)被按“或”操作,保存到目标任务的待处理事件集中。接收事件(集)在接收事件(集)时可以有如下选项WAITNO_WAIT接收事件(集)时可等待接收事件(集)时可等待接收事件(集)时不等待接收事件(集)时不等待接收者永远等待,直到事件接收者永远等待,直到事件条件被满足后成

49、功返回;条件被满足后成功返回;接收者根据指定的时限等待。接收者根据指定的时限等待。EVENT_ALLEVENT_ANY待处理事件集必须包含事件条件中的全部事件方可满足要求,待处理事件集必须包含事件条件中的全部事件方可满足要求,即按照即按照“与与”条件接收事件条件接收事件待处理事件集只要包含事件条件中的任一事件即可满足要求,待处理事件集只要包含事件条件中的任一事件即可满足要求,即按照即按照“或或”条件接收事件条件接收事件获取有关事件集的各种信息 获取有关事件集的各种信息:包括活动事件集的列表,事件集的名称和ID等。设置事件设置事件设置事件设置事件Task1ISR来自某设备的来自某设备的中断中断T

50、ask2消息队列消息队列Q事件标志集事件标志集信号量信号量S01000100发送消息发送消息释放信号量释放信号量接收消息接收消息获取信号获取信号量量事件机制的典型应用解决复杂的应用设计问题发送方(发送方(Task1Task1或或ISRISR)发送信息(消息或信号发送信息(消息或信号量);量);发送方(发送方(Task1Task1或或ISRISR)设置相应的事件标志设置相应的事件标志(指示消息或信号量的(指示消息或信号量的发送);发送);接收方(接收方(Task2Task2)检)检测事件标志集,判断是测事件标志集,判断是否满足其接收条件否满足其接收条件(“与与”条件接收或条件接收或“或或”条件接收);条件接收);接收方(接收方(Task2Task2)根)根据事件标志集的指示定据事件标志集的指示定向接收信息(消息或信向接收信息(消息或信号量),达到和不同发号量),达到和不同发送方(送方(Task1Task1或或ISRISR)同)同步或通信的目的。步或通信的目的。适用情况:适用情况:Task2Task2,需要获得消息队列,需要获得消息队列Q Q的消息或得到信号量的消息或得到信号量S S,单纯使用获取消息操作,则可能被阻塞在消息队列上,无法及单纯使用获取消息操作,则可能被阻塞在消息队列上,无法及时得到信号量,反之亦然。时得到信号量,反之亦然。谢谢!谢谢!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!