第10讲-嵌入式OS内核-任务通信与同步_第1页
第10讲-嵌入式OS内核-任务通信与同步_第2页
第10讲-嵌入式OS内核-任务通信与同步_第3页
第10讲-嵌入式OS内核-任务通信与同步_第4页
第10讲-嵌入式OS内核-任务通信与同步_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10讲

任务通信与同步主要内容概述信号灯消息队列事件管道概述多任务系统中任务之间的关系相互独立仅竞争CPU资源竞争除CPU外的其他资源(互斥)同步协调彼此运行的步调,保证协同运行的各个任务具有正确的执行次序通信彼此间传递数据或信息,以协同完成某项工作进程同步的例子只有当售票员关门之后司机才能启动车辆,只有司机停车之后售票员才能开车门。司机和售票员的行动需要一定的协调。同样地,两个进程之间有时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序任务能以以下方式与中断处理程序或其他任务进行同步或通信:单向同步或通信:一个任务与另一个任务或一个ISR同步或通信。双向同步或通信:两个任务相互同步或通信。双向同步不能在任务与ISR之间进行,因为ISR不能等待。概述ISRxTaskyPOSTPEND任务与ISR之间的同步(单向)TaskxTaskyPOSTPENDPOSTPEND任务与任务之间的同步(双向)任务与任务之间的同步(单向)TaskxTaskyPOSTPEND在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号灯(semaphore),用于互斥与同步事件(组)(eventgroup),用于同步异步信号(asynchronoussignal),用于同步邮箱(mailbox)、消息队列(messagequeue),用于消息通信管道(pipe),提供非结构化数据交换和实现同步概述以下一些机制也可用于同步与通信(在单处理器或多处理器系统中):全局变量共享内存套接字(Sockets)远程过程调用(RemoteProcedureCall)概述Linux下任务通信手段信号消息队列管道信号灯套接字共享存储段第一节

信号灯信号灯的种类及用途互斥信号灯二值信号灯计数信号灯信号灯机制的主要数据结构典型的信号灯操作信号灯(Semaphore或称信号量)用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。信号灯一般分为三种:信号灯的种类及用途用于解决互斥问题。它比较特殊,可能会引起优先级反转问题。用于解决同步问题用于解决资源计数问题互斥信号灯计数信号灯二值信号灯用互斥信号灯保护的代码区称作“临界区”,临界区代码通常用于对共享资源的访问。互斥信号灯的值被初始化成1,表明目前没有任务进入“临界区”,但最多只有一个任务可以进入“临界区”。第一个试图进入“临界区”的任务将成功获得互斥信号灯,而随后试图进入用同一信号灯保护的临界区的所有其他任务就必须等待。当任务离开“临界区”时,它将释放信号灯并允许正在等待该信号灯的任务进入“临界区”。互斥信号灯Task1Task2共享资源互斥信号灯共享资源可能是一段存储器空间、一个数据结构或I/O设备,也可能是被两个或多个并发任务共享的任何内容。使用互斥信号灯可以实现对共享资源的串行访问,保证只有成功地获取互斥信号灯的任务才能够释放它。互斥信号灯是一种特殊的二值信号灯,一般它支持所有权、递归访问、任务删除安全和一些避免优先级反转、饥饿、死锁等互斥所固有问题的协议。互斥信号灯状态图互斥信号灯状态图开启锁定初始化值为1申请并获得值为0释放值为1申请(递归)并获得锁定数加1释放(递归)锁定数减1互斥信号灯所有权:当一个任务通过获取互斥信号灯而将其锁定时,得到该互斥信号灯的所有权。相反,当一个任务释放信号灯时,失去对其的所有权。当一个任务拥有互斥信号灯时,其他的任务不能再锁定或释放它,即任务要释放互斥信号灯,必须事前先获取该信号灯。二值信号灯二值信号灯主要用于任务与任务之间、任务与中断服务程序之间的同步用于同步的二值信号灯初始值为0,表示同步事件尚未产生;任务申请信号灯以等待该同步事件的发生;另一个任务或ISR到达同步点时,释放信号灯(将其值设置为1)表示同步事件已发生,以唤醒等待的任务。Task1Task2二值信号灯初值为0二值信号灯二值信号灯状态图可获得不可获得申请并获得(值为0)释放(值为1)初始化值为0Task1(){……执行一些操作;将信号灯sem1置1;

申请信号灯sem2;…………}Task2(){……

申请信号灯sem1;执行一些操作;将信号灯sem2置1;…………}Task2申请信号灯sem1失败,系统切换到Task1sem1被置1后,Task2得到sem1并抢占Task1Task2运行到某处时因某种原因被阻塞,系统切换到Task1用二值信号灯实现两个任务之间的双向同步Task2优先级高于Task1sem1和sem2的初始值均为0计数信号灯计数信号灯用于控制系统中共享资源的多个实例的使用,允许多个任务同时访问同一种资源的多个实例计数信号灯被初始化为n(非负整数),n为该种共享资源的数目。Task1Task2共享资源实例nTaskm共享资源实例1…………计数信号灯计数信号灯状态图可获得不可获得初始化值大于0申请并获得值为0释放值为1申请并获得值减1释放值加1计数信号灯1234…………n生产者任务消费者任务计数信号灯使用实例:生产者-消费者问题(有界缓冲问题)问题描述:一个仓库可以存放n件物品。生产者每生产一件产品,将产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,然后进行消费,仓库空时就停止消费。

生产者任务do{…产生一个数据项…申请empty申请mutex…将新生成的数据项添加到缓冲中…释放mutex释放full}while(1);消费者任务do{申请full申请mutex…从缓冲中移出一个数据项的内容…释放mutex释放empty…消费新获得的数据项内容…}while(1);计数信号灯full:已被填充的数据项数目,取值范围0-n,初始值为0计数信号灯empty:空闲数据项数目,取值范围为0-n,初始值为n;互斥信号灯mutex:控制生产者任务和消费者任务对有界缓冲的访问,初始值为1。哲学家就餐问题问题描述:

一个房间内有5个哲学家,他们的生活就是思考和进食。房间里有一张圆桌,中间放着一盘通心粉(假定通心粉无限多)。桌子周围放有五把椅子,分别属于五位哲学家每两位哲学家之间有一把叉子,哲学家进食时必须同时使用左右两把叉子。仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。利用信号量的保护机制实现。通过信号量mutex对就餐之前的取左侧和右侧叉子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。信号灯机制的主要数据结构SCB1SCB2…………信号灯控制块count信号灯名字或IDTask1Task2……任务等待列表信号灯机制的主要数据结构信号灯控制块:管理所有创建的信号灯,内核在系统运行时动态分配和回收信号灯控制块互斥和二值信号灯控制块结构:Binary_Semaphore_Control_Blockwait_queue 任务等待队列attributes 信号灯属性 lock_nesting_behavior试图嵌套获得时的规则wait_discipline 任务等待信号灯的方式 priority_ceiling 优先级天花板值lock 是否被占有holder 拥有者

nest_count 嵌套层数计数信号灯控制结构Counting_Semaphore_Control_Block

wait_queue 任务等待队列attributes 计数信号灯属性

maximum_count 最大计数值wait_discipline 任务等待信号灯的方式count 当前计数值信号灯机制的主要数据结构典型的信号灯操作创建信号灯获取(申请)信号灯释放信号灯删除信号灯清除信号灯的任务等待列表获取有关信号灯的各种信息第二节

消息队列通信方式概述消息队列机制的主要数据结构典型的消息队列操作消息队列的其他典型使用任务间的通信方式直接通信。在通信过程中双方必须明确地知道(命名)彼此:Send(P,message)–发送一个消息到任务PReceive(Q,message)–从任务Q接收一个消息

间接通信。通信双方不需要指出消息的来源或去向,而通过中间机制来通信。如:send(A,message)–发送一个消息给邮箱Areceive(A,message)–从邮箱A接收一个消息通信方式概述消息队列:属于间接通信方式消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空。对消息内容的解释由应用完成。从操作系统观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。从应用观点看,根据应用定义的消息格式,消息被解释成特定的含义。应用可以只把消息当成一个标志,这时消息机制用于实现同步概述消息队列就是一个消息的链表。每个消息队列都有一个队列头,用结构structmsg_queue来描述。队列头中包含了该消息队列的大量信息,包括消息队列键值、用户ID、组ID、消息队列中消息数目等等,甚至记录了最近对消息队列读写进程的ID。读者可以访问这些信息,也可以设置其中的某些信息。消息队列机制的主要数据结构队列控制块队列长度QCB1队列名或IDTask3Task4……接收任务等待列表Task1Task2……发送任务等待列表最大消息长度QCB2……消息队列及其相关的参数和支持数据结构消息队列状态图非空满队列创建消息数为0消息队列状态图消息发送消息数加1空消息发送消息数为1消息接收消息数为0消息接收消息数减1消息接收消息数减1消息发送消息数等于队列长度消息队列机制的主要数据结构消息队列控制块管理所有创建的消息队列,系统运行时动态分配和回收消息队列控制块消息队列缓冲区存放发送到该队列的消息,接收者从缓冲区中取出消息。消息的发送或接收有两种方法(影响消息缓冲区结构):将数据从发送任务的空间完全拷贝到接收任务的空间中(效率较低,执行时间与消息大小有关)只传递指向数据存储空间的指针(提高系统性能)number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_message_count消息队列控制块消息队列缓冲区消息队列机制的主要数据结构消息队列的环形缓冲消息队列机制的主要数据结构max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指针Linux中的消息队列Linux维护了一系列消息队列的msgque向量表。其中的每一个单元都指向一个msqid_ds的数据结构,完整描述这个消息队列。当创建消息队列的时候,从系统内存中分配一个新的msqid_ds的数据结构并插入到向量表中。每一个msqid_ds数据结构都包括一个ipc_perm的数据结构和进入这个队列的消息的指针。另外,Linux保留队列的改动时间,例如上次队列写的时间等。Msqid_ds队列也包括两个等待队列:一个用于向消息队列写,另一个用于读。每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的ipc_perm数据结构的模式比较。如果进程可以想这个队列写,则消息会从进程的地址空间写到msg数据结构,放到消息队列的最后。每一个消息都带有标记。因为Linux限制写的消息的数量和长度,可能会没有空间容纳消息。这时,进程会被放到消息队列的写等待队列,然后调用调度程序选择一个新的进程运行。当一个或多个消息从这个消息队列中读出去的时候会被唤醒。从队列中读是一个相似的过程。进程的访问权限一样被检查。一个读进程可以选择是不管消息的类型从队列中读取第一条消息还是选择特殊类型的消息。如果没有符合条件的消息,读进程会被加到消息队列的读等待进程,然后运行调度程序。当一个新的消息写到队列的时候,这个进程会被唤醒,继续运行。典型的消息队列操作创建消息队列发送普通消息发送紧急消息发送广播消息接收消息删除消息队列获取有关消息队列的各种信息创建消息队列创建消息队列时,调用者可以指定如下参数:消息的最大长度每个消息队列中最多的消息数消息队列的属性任务等待消息时的排队方式:FIFO或PRIORITY系统为新创建的消息队列分配唯一的ID发送消息根据紧急程度的不同,消息通常可分为普通消息与紧急消息。如果有任务正在等待消息(即消息队列为空),则普通消息发送和紧急消息发送的执行效果是一样的。任务从等待队列移到就绪队列中,消息被拷贝到任务提供的缓冲区中(或者由接收任务得到指向消息的指针)。如果没有任务等待,发送普通消息将消息放在队列尾,而发送紧急消息将消息放在队列头。发送消息Msg3接收任务等待列表Msg2Msg1消息队列发送普通消息-先进先出(FIFO)次序Msg3接收任务等待列表Msg2Msg1消息队列发送紧急消息-后进先出(LIFO)次序发送消息如果发送消息时队列已被填满,则不同的操作系统可能采取不同的处理办法:挂起试图向已满的消息队列中发送消息的任务(不适用于中断服务程序)简单地丢弃该条消息并向调用者返回错误信息广播消息。在此之前所有试图从队列中接收消息的任务此时都将获得相同的消息。该功能拷贝消息到各任务的消息缓冲中(或者让所有的等待任务得到指向消息的指针),并唤醒所有的等待任务。接收消息如果指定的消息队列中有消息,则将其中的第一条消息拷贝到调用者的缓冲区(或者将第一条消息指针传递给调用者),并从消息队列中删除它。如果此时消息队列中没有消息,则可能出现以下几种情况:永远等待消息的到达:等待消息的任务按FIFO或优先级高低顺序排列在等待队列中等待消息且指定等待时限:等待消息的任务按FIFO或优先级高低顺序排列在等待队列中不等待,强制立即返回接收消息限时等待可有效预防死锁中断服务程序接收消息时必须选择不等待,因为中断服务程序是不能被阻塞的。如果消息队列被应用删除,则所有等待该消息队列的任务都被返回一个错误信息,并回复到就绪状态。接收消息Task4High消息队列接收任务等待列表任务等待列表-基于优先级的次序Task2mediumTask3mediumTask1LowTask4High消息队列接收任务等待列表任务等待列表-先进先出(FIFO)次序Task2mediumTask3mediumTask1Low删除消息队列从系统中删除指定的消息队列,释放消息队列控制块及消息队列缓冲区。任何知道此消息队列ID号的代码都可以删除它。消息队列被删除后,所有等待从这个消息队列接收消息的任务都回到就绪态,并得到一个错误信息表明消息队列已被删除。消息队列的其他典型使用紧耦合的单向数据通信:发送任务发送消息后要求一个响应信号,表明接收任务已经成功接收到消息。Task1Task2

消息队列的其他典型使用紧耦合的双向数据通信:如果数据需要在任务之间双向流动,则可以采用紧耦合的双向数据通信模式(也称为全双工通信)。Task1Task2第三节

事件概述事件机制的主要数据结构典型的事件操作事件机制的典型应用在嵌入式实时内核中,事件是指一种表明预先定义的系统事件已经发生的机制。事件机制用于任务与任务之间、任务与ISR之间的同步。其主要的特点是可实现一对多的同步。

一个事件就是一个标志,不具备其它信息。一个或多个事件构成一个事件集。事件集可以用一个指定长度的变量(比如一个8bit,16bit或32bit的无符号整型变量,不同的操作系统其具体实现不一样)来表示,而每个事件由在事件集变量中的某一位来代表。概述事件及事件集有以下特点:事件间相互独立事件仅用于同步,不提供数据传输功能事件无队列,即多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。提供事件机制的意义在于:当某任务要与多个任务或中断服务同步时,就需要使用事件机制。若任务需要与一组事件中的任意一个发生同步,可称为独立型同步(逻辑“或”关系)。任务也可以等待若干事件都发生时才同步,称为关联型同步(逻辑“与”关系)。概述“或”同步和“与”同步概述任务任务任务任务ISRISRORAND“与”型同步“或”型同步事件集事件集POSTPOSTPENDPEND用多个事件的组合发信号给多个任务概述任务任务任务ISRORAND事件集事件集事件集(8,16或32位)POSTPENDPEND术语:发送事件集。指在一次发送过程中发往接收者(比如任务)的一个或多个事件的组合。待处理事件集。指已被发送到一个接收者但还没有被接收(即正在等待处理)的所有事件的集合。事件条件。指事件接收者在一次接收过程中期待接收的一个或多个事件的集合。“或”同步:待处理事件集只要包括事件条件中的任一事件即可满足要求;“与”同步:其二是待处理事件集必须包括事件条件中的全部事件方可满足要求。

概述事件机制的主要数据结构事件集控制块:管理所有创建的事件集或者事件集附属于任务,不需创建,其相关参数成为任务控制块的一部分典型的事件操作创建事件集删除事件集发送事件(集)接收事件(集)获取有关事件集的各种信息设置事件②设置事件②Task1ISR来自某设备的中断Task2消息队列Q事件标志集信号灯S01000100发送消息①释放信号灯①接收消息④获取信号量④③事件机制的典型应用解决复杂的应用设计问题①发送方(Task1或ISR)发送信息(消息或信号灯);②发送方(Task1或ISR)设置相应的事件标志(指示消息或信号灯的发送);③接收方(Task2)检测事件标志集,判断是否满足其接收条件(“与”条件接收或“或”条件接收);④接收方(Task2)根据事件标志集的指示定向接收信息(消息或信号灯),达到和不同发送方(Task1或ISR)同步或通信的目的。

第四节

管道概述管道机制的主要数据结构典型的管道操作管道机制的典型应用管道机制概述管道(pipe)是提供非结构化数据交换和实现任务间同步的内核对象。在传统的实现中,管道是单向数据交换设施。Task1Task2管道管道中的数据写描述符读描述符向管道写数据从管道读数据数据在管道内像一个非结构字节流,按FIFO的次序从管道中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。管道机制概述管道允许有多个读者和写者。Task1Task5管道Task2Task3Task4Task6ISR1ISR2ISR3公共管道操作管道机制概述管道与消息队列的区别管道不存储多个消息,它存储的数据是非结构化的字节流;管道中的数据严格地遵循先进先出的顺序;管道支持选择(select)操作,而消息队列不支持。管道机制概述管道的状态非空满创建管道无写入数据读数据,有剩余数据空写数据读数据,无数据留下写数据,有剩余空间读数据写数据,无剩余空

温馨提示

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

评论

0/150

提交评论