ucos II 任务通信与同步

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务的同步与一个通信初解

操作系统就像就像一个好的家长,控制着资源的公平分配

应用程序中的各个任务,必须通过彼此之间的有效合作,才能完成一项大规模的工作。因为这些任务在运行时,经常需要相互无冲突地访问一个共享资源,或者需要相互支持和

依赖,甚至有时候还需要互相加以必要的制约,才能保证任务的顺利进行。因此操作系统

必须具有对任务运行进行协调的能力,从而使任务之间可以无冲突,流畅的同步运行,而

不致导致灾难性的后果。

这与人们依靠通信来相互沟通,从而使人际关系和谐,工作顺利的做法是一样的,计算机系统依靠任务间的良好通信来保证任务与任务的同步。

任何为任务所占用的实体都可以称为资源。资源可以是输入输出设备,比如打印机,键

盘显示器,资源也可以是一个变量,一个结构或者是一个数组。

1任务的同步和事件

嵌入式系统中的各个任务是为同一个大的任务服务的子任务,他们不可避免的要共同使

用一些资源,并且在处理一些需要多个任务共同协同来完成的工作时,还需要相互的支持和限制。因此,对一个完善的多任务操作系统来说,系统必须具有完备的同步和通信机制任务的同步:

为了实现各个任务之间的合作和无冲突的运行,在各个任务之间必须建立一些制约关系。其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系

直接制约关系来自任务的合作:例如,有任务A和任务B两个任务,他们需要通过访

问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责向缓

冲区读取该数据。显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因

不能从缓冲区得到有效地数据而应处于等待状态;只有等任务A向缓冲区写入了数据之后,才应该通知任务B去读取数据。相反,当缓冲区的数据还未被任务B读取时(缓冲区为满时),任务A就不能向缓冲区写入新的数据而应该处于等待状态;只有当任务B自缓冲区读取数据后,才应该通知任务A写入数据。显然,如果这两个任务不能如此协调工作,将势必造成严重的后果。

间接制约关系源于对资源的共享:例如:任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态;

只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。如果这两

个系统不这样做,那么也会造成严重的后果。

由此可知:在多任务合作工作的过程中,操作系统应该解决两个问题:一是各任务之间应该具有一种互斥的关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到这个任务释放该资源后,等待的任务之一才能使用它;二是相关的任务在执行上要有先后顺序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续进行,否则只能等待。

任务间的这种制约性的合作运行机制叫做任务间的同步

2 事件

ucos使用信号量,邮箱和消息队列这些中间环节来实现任务间的通信。为了方便起见,这些中间环节统一被称作“事件”

这是两个任务通过事件进行通信的示意图。任务1是发信方,任务2是收信方。作为发信方,任务1的责任是把信息发到事件上,这项操作叫做发送事件。作为收信方,任务2的责任是通过读事件操作对事件进行查询:如果有信息,则读取信息;否则等待。读事件操作叫做请求事件。

ucos把任务发送事件,请求事件以及其他对事件的操作都定义成全局函数

(1)信号量

信号量是一类事件。使用信号量的最初目的,是为了给共享资源设立一个标志,该标志表示该共享资源被占用的情况。这样,当一个任务在访问共享资源之前,就可以先对这个标志进行查询,从而在了解资源被占用的情况之后,来决定自己的行为。信号量说白了就是一个表明共享资源占用情况的标志量。

观察一下人们得日常生活,常用到的共享资源----公用电话亭的使用规则,就会发现这种规则很适合在协调某种资源用户关系时使用。

如果一个电话亭只允许一个人进去打电话,那么电话亭的门上就应该有一个变换颜色的牌子。(例如,红色表示有人,绿色表示没人)当有人进去时,牌子就会变成红色;出来时牌子就会变成绿色。这样打电话的人就可以根据牌子的颜色来了解电话亭的被占用情况。例如,如果有一个人去电话亭打电话时,见到牌子上的颜色是绿色的,那么他就可以进去打电话;如果见到牌子上的颜色是红色的,那么他只好等待;如果又陆续来了很多人,那么就要排队等待。显然电话亭的牌子就是一个表示电话亭是否已被占用的标志。由于这种标志特别像交叉路口的信号灯,所以人们最初给这种标志起的名称就是信号灯。后来因为它含有了量得概念,所以又叫做信号量。

如果电话亭可以允许多个人打电话,那么电话亭门前就不应该是那种只有红绿两种颜色的牌子。而应该是一个计数器,该计数器每进去一个人时就会自动减一。而每出去一个人时,就会自动加一。如果其初值按电话亭的最大容量来设置,那么来人只要见到计数器的值大于0,就可以进去打电话;否则,只好等待。这种计数式的信号叫做信号量。

这是两个任务是用互斥型信号量进行通信,从而使这两个任务无冲突地访问一个共享资源。任务1在访问共享资源之前先进行请求信号量的操作,当任务1发现信号量的标志为“1”时,他一方面把信号量的标志由1改为0,另一方面进行共享资源的访问。如果任务2在任务1已经获得信号之后来请求信号量,那么由于他获得的信号量的标志是0,所以任务2就只有等待而不能访问共享资源了。显然,这种做法可以有效地防止两个任务同时访问一个共享资源所造成的冲突。

那么任务2何时才能访问共享资源呢?当然是任务1使用完共享资源之后,由任务1向信号量发信号是信号量的标志由0变为1时,任务2就有机会访问共享资源了。和任务1一样,任务2一旦获得了共享资源的使用权,那么在访问共享资源之前一定要把信号量的标志由1置为0。

对任哲书120页程序的说明

在程序YourTask有以上一段话。

OSTime是记录时钟节拍数的一个全局变量。因为在MyTask中OSTimeDly(200),因为MyTask的优先级更高,所以在YourTask()运行等待500个时钟节拍的过程中,会被MyTask 中断两次,因为没有对共享资源(全局变量char *s)进行保护,所以每次中断都会被MyTask修改,这时YourTask得到的就是“错误”的信息

在任哲书123页程序中在MyTask和YourTask中都加上了这样一段话

这里的ac_key充当的就是信号量的作用。而ac_key =FALSE, ac_key = TRUE这两句话充当的就是

任务1在访问共享资源之前先进行请求信号量的操作,当任务1发现信号量的标志为“1”时,他一方面把信号量的标志由1改为0,另一方面进行共享资源的访问。如果任务2在任务1已经获得信号之后来请求信号量,那么由于他获得的信号量的标志是0,所以任务2就只有

相关文档
最新文档