资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
13 Sept. 2008 Confidential四、四、四、四、 任务的同步与通信任务的同步与通信任务的同步与通信任务的同步与通信东软IT人才实训中心Copyright 2008 By Neusoft Group. All rights reserved3 Sept. 2008 Confidential第四章:任务的同步与通信第四章:任务的同步与通信第四章:任务的同步与通信第四章:任务的同步与通信目标: 本章旨在向学员介绍任务的同步机制及通 信方式,通过本章的学习,学员应该掌握 如下知识: 事件控制块的概念 信号量及其使用 消息邮箱及其使用 消息队列及其使用学时:学时:6.06.0学时学时教学方法:讲授教学方法:讲授pptppt上机练上机练 习点评案例分析习点评案例分析3 Sept. 2008 Confidential4.1 4.1 4.1 4.1 任务间的同步和事件控制块任务间的同步和事件控制块任务间的同步和事件控制块任务间的同步和事件控制块 嵌入式系统中的各个任务都是以并发的方式运行,为同一个大任务服务。 不可避免地要共同使用一些共享资源。 多任务协作处理,需要相互的支持和限制。 所以,系统必须具有完备的同步和通信机制。系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互 相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。因 此,操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流 畅地同步运行,而不致导致灾难性的后果。 与人们依靠通信来互相沟通,从而使人际关系和谐、工作顺利的做法一样,计算机系统是依靠任务之间的良好通信来保证任务与任务的同步的。 3 Sept. 2008 Confidential4.1.1 任务间的同步 为了实现各任务之间的合作和无冲突的运行,在各任务之间必须建立 一些制约关系。 直接制约关系:源于任务之间的合作。 间接制约关系:源于对资源的共享。直接制约关系举例直接制约关系举例直接制约关系举例直接制约关系举例:有2个任务,任务A和任务B,他们需要通过访问同一 个数据缓冲区,合作完成一项工作,任务A负责向缓冲区写入数据,任务 B负责从缓冲区读数据。显然,任务A还未向缓冲区写入数据时(缓冲区 为空时),任务B因不能从缓冲区得到有效数据而处于等待状态。只有等 任务A向缓冲区写入了数据后,才应该通知任务B去取数据。相反,当缓 冲区的数据还未被任务B读取时(缓冲区还满时),任务A就不能向缓冲 区写入新的数据而应该处于等待状态,只有等任务B自缓冲区读取数据 后,才应该通知任务A去写入数据。间接制约关系举例间接制约关系举例间接制约关系举例间接制约关系举例:任务A和任务B共享一台打印机,如果系统已经把打 印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等 待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打 印机的使用权。3 Sept. 2008 Confidential在多任务合作工作的过程中,由于任务间存在上述两种制约关系,操作 系统应该解决两个问题: 1. 各任务之间的互斥关系。 2. 相关的任务在执行上要有先后次序。任务之间这种制约性的合作运行机制叫做任务间的同步。 任务的同步是依靠任务之间互相发送消息来保证同步的。解决问题解决问题解决问题解决问题1-1-1-1-互斥关系互斥关系互斥关系互斥关系:即对于某个共享资 源,如果一个任务正在使用,则其他任务 只能等待,等到该任务释放该资源后,等 待的任务之一才能使用它。解决问题解决问题解决问题解决问题2-2-2-2-先后次序先后次序先后次序先后次序:一个任务要等其伙伴 发来通知,或建立了某个条件后才能继续执 行,否则只能等待。4.1.1 任务间的同步(续)总之,操作系统必须具有对任务的运行进行协调的能力,从而使任 务之间可以无冲突、流畅的同步运行,而不致导致灾难性的后果。3 Sept. 2008 Confidential 多个任务共享同一资源或有工作顺序要求时,在正 式工作之前要互相打招呼 。 黄宏:别走啊! 宋丹丹:我自己的腿,我爱走就走,你管不着! 黄宏:腿是你自己的,但手是咱俩的呀!3 Sept. 2008 Confidential4.1.2 事件事件任务1任务2发送事件请求事件图4-1 两个任务使用事件进行通信示意图 任务间的同步依赖于任务间的通信。在uC/OS-II中,使用信号量、邮 箱和消息队列这些被称作事件事件事件事件的中间环节来实现任务间的通信。任务1的责任是把 信息发送到事件 上,这项操作叫 做发送事件。任务2的责任是通 过事件操作对事件 进行查询:如果有 信息,则读取信 息,如果没有,则 等待。读事件的操 作叫做请求事件。uC/OS-II把任务发送事件、请求事件以及其他对事件的操作都定义为全局函数,以供应 用程序的所有任务来调用。3 Sept. 2008 Confidential4.1.2.1 信号量 使用信号量的目的:为共享资源设立一个表示该共享资源被占用情况 的标志。 日常生活中的共享资源-列车卫生间、公共停车场的使用规则。 互斥型信号量、计数式信号量。信号量任务1任务2先请求信号量图4-2 两个任务使用信号量进行通信示意图后请求信号量1 - 0共享资源信号量任务1任务2发送信号量请求信号量0 - 1 - 0共享资源3 Sept. 2008 Confidential例程 4-1:本例的应用程序中有2个用户任务:MyTask和YourTask。这两个任务都要 访问同一个共享资源s,但YourTask访问s需要的时间长一些(本例中使用 了一个循环来模拟访问的时间),而MyTask访问s的时间要短一些,这样 就不可避免的出现了在任务YourTask访问s期间,任务MyTask也来访问s, 从而出现了干扰。在例4-1的应用程序中定义一个全局变量ac_key来作为信号量,并根据该 信号量的状态来访问共享资源s,以解决冲突问题。例程 4-2:如果把任务YourTask代码中的发信号语句ac_key=TRUE删掉,什么样结果?3 Sept. 2008 Confidential4.1.2.2 消息邮箱 在多任务系统中,常常需要在任务之间通过传递一个数据(这个数据叫做 “消息”)的方式来进行通信。为达到这个目的,可在内存中创建一个存储空间 作为该数据的缓冲区。如果把这个缓冲区叫做消息缓冲区,那么在任务间传递数 据(消息)的一个最简单方法就是传递消息缓冲区的指针。 用来传递消息缓冲区指针的数据结构就叫做消息邮箱。消息邮箱任务1任务2发送消息 (发送消息缓冲区指针)图4-3 两个任务使用消息邮箱进行通信示意图请求消息 (读取消息缓冲区指针)指针消息缓冲区3 Sept. 2008 Confidential例程 4-3:下面是一个利用消息邮箱进行通信的例子:本例中有两个任务MyTask和 YourTask。由于任务YourTask要向任务MyTask发送消息,因此定义了一个 全局的指针变量msg_p作为邮箱来传递消息的指针。3 Sept. 2008 Confidential4.1.2.3 消息队列 消息邮箱不仅可以用来传递一个消息,而且也可定义一个指针数组。让数组 的每个元素都存放一个消息缓冲区指针,那么任务就可通过传递这个指针数组指 针的方法来传递多个消息。 用来传递多个消息的数据结构就叫做消息队列。消息队列任务1任务2发送消息队列 (发送消息缓冲区指针数组的指针)图4-4 两个任务使用消息对列进行通信示意图请求消息队列 (读取消息缓冲区指针数组的指针)指针消息缓冲区1消息缓冲区n消息缓冲区指针数组3 Sept. 2008 Confidential4.1.2.4 等待任务列表(一个事件对多个任务) 对等待任务需要具有管理功能,包括2个方面: 要对等待事件的所有任务进行记录并排序; 应该允许任务有一定的等待时限。OSEventGrp1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0图4-5 事件的等待任务表任务等待表OSEventTbl在多任务系统中,当一个事件被占用 时,其他请求该事件的任务在暂时得 不到事件的服务时应该处于等待状态。 因此作为功能完善的事件,应该有对 这些等任务有一定的管理功能。对于等待任务时间的记录, 采用与任务就绪表类似的方 法,数组OSEventTbl作为 记录等待事件任务的记录表。 在这个等待任务表中仍然是 以任务的优先级别为顺序, 令系统中的每个任务都在表 中占据一位,并用该位为1表 示这一位对应的任务为事件 的等待任务。同样为了加快 对该表的访问速度,定义变 量OSEventGrp来表示等待任 务表中的任务组。至于等待任务的等待时限, 则记录在等待任务的任务控 制块TCB的成员OSTCBDly中, 并在每个时钟节拍中断服务 程序中对该数据进行维护。 每当有任务的等待时限已到 时,将该任务从等待任务表 中删除,并使它进入就绪态。3 Sept. 2008 Confidential4.1.3 事件控制块 为了把描述事件的数据结构统一起来,uC/OS-II使用叫做事件控制块(ECB) 的数据结构来描述诸如信号量、邮箱和消息队列这些事件。 ECB中包含包括等待 任务表在内的所有有关事件的数据。 定义在文件uC/OS-II.H中的ECB的数据结构如下:typedef struct INT8U OSEventType; / 事件的类型 INT16U OSEventCnt; / 信号量计数器void *OSEventPtr; / 消息或消息队列的指针INT8U OSEventGrp; / 等待事件的任务组INT8U OSEventTblOS_EVENT_TBL_SIZE ; / 任务等待列表 OS_EVENT;3 Sept. 2008 Confidential4.1.3 事件控制块(续)OSEventTypeOSEventCntOSEventPtrOSEventGrp1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0图4-6 事件控制块ECB的结构任务等待表OSEventTblOS_EVENTpeventOSEventType的值说明OS_EVENT_TYPE_SEM表明事件是信号量OS_EVENT_TYPE_MUTEX表明事件是互斥性信号量OS_EVENT_TYPE_MBOX表明事件是消息邮箱OS_EVENT_TYPE_Q表明事件是消息队列OS_EVENT_TYPE_UNUSED空事件控制块(未被使用)表4-1 OS
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号