Ucos中任务间的同步如何实现?

  所谓ucos系统任务间的同步,是指两个任务之间要满足某种关系,但没有数据的交互。

同步的方案分为3

1)信号量

  假设这里有两个任务Task1Task2,第一个任务进行按键的扫描,第二个任务进行LED灯的点亮,假设我们已经扫描到这个按键已经按下了,按键按下以后,我们要求LED灯亮,那也就是说我们的第二个任务永远在等待第一个任务按键的扫描,我们看一下Task1Task2之间怎么进行按键的同步,首先Task1一直在检测这个按键是否按下,如果按键按下以后,在这里我们使用一个全局变量flag,按键按下以后,我们就设置flag=1,而在Task2当中,不停的检测这个值是多少,flag是否=1,如果=1,就让LED灯亮,并且把flag清零,在这里flag提供的是一个信号量的作用,也就是说Task1按下按键以后,开始向Task2发送一个信号量flagTask2接收到了flag信号量以后,就把LED灯点亮,所以flag在这里提供的是一个信号量的作用。但是我们要注意,ucos当中的信号量并不是我们这里写的全局变量,它是一个可以操作的东西。

  从这里我们可以看到Task1Task2它们之间有一个约束,同步关系,但是Task1Task2之间并没有进行一个信息的交互,也就是没有一个数据的交互过程。

2)互斥性信号量

  假设这里还是有两个任务Task1Task2,假设这两个任务在运行的过程中,都需要来访问一个共享的资源,假设要访问一个共享的打印机,假设第一个任务Task1要打印hello,第二个任务Task2要打印world,那我们很显然可以看到,Task1在使用打印机的时候,Task2是绝对不能使用的,为什么呢?

  因为如果Task1在使用打印机,Task2也在使用打印机,那打印出来的数据就不再是hello world,有可能变成H W E R O等等,这些乱七八糟的数据,为了防止Task1Task2共同使用打印机,我们在这里配置的时候就要使用一个约束,假设,我们还是使用一个全局变量来表示,用这个flag来表示,flag=1,表示这个打印机处于空闲状态,假设这个时候Task1要使用打印机,它首先要判断flag的状态,如果flag=1,这个时候,它就开始使用打印机,并且把flag=0,同样,假设这个时候,Task2也来使用打印机,它同样要判断flag的状态是否等于1,它一判断这个时候flag=0,它就知道,这个时候打印机处于忙的状态,也就是不是空闲的状态,那它怎么办呢?

  它就要等待,等待Task1这个任务把我们的打印机使用完毕,使用完毕以后,它就会把这个flag置为1,这个时候,我们的Task2这个任务,就可以使用打印机了。在这个地方,我们可以看到,这个flag充当的是互斥性信号量的作用,什么意思呢?

  就是Task1Task2它们两个构成一个互斥关系,就是我在使用的时候,你不能使用,这就是一个互斥性信号量,那么判断flag的状态的语句,被称为获取信号量,或者叫做等待互斥性信号量,就是我们等待互斥性信号量,当我们等到以后,就开始使用这个共享资源,使用完毕以后,我们要发送这个互斥性信号量,flag=1,这个过程就是一个发送互斥性信号量的过程,那同样Task2也是一样的,首先等待这个互斥性信号量,当我们等到以后,就可以使用这个共享资源,使用完毕共享资源以后,接下来我们还是这样发送这个互斥性信号量,所以这个互斥性信号量的使用过程,第一步是等待,第二步是使用,第三步是发送。

3)事件标志组

  我们还是提供两个任务Task1Task2,假设Task1还是进行按键扫描,Task2进行LED灯的点亮,同样的道理,第一个按键按下,LED灯亮,那假设我们这里的按键它不是一个按键,或者它有N个按键怎么办,它控制的LED也不是一个,而是NLED,这个时候,我们还是使用一个全局变量flag,只不过这个时候,当第一个flag的按键被按下以后,flag的第0位为1flag的第0位为0,表明第一个没有被按下,同样flag的第1位按键为1,表明第一个按键已经按下,第1位按键为0,表明第一个没有被按下,等等往下来表示。

  那也就是说,我们用flag的各个位来表明了按键按下的状态,那这个时候,我们的flag已经不再是一个信号量了,而是一个事件的标志,它的一位标志着一个事件是否发生,比如说第0位为0,表明这个事件没发生,第1位为1,表明这个事件发生了,这个时候这个flag就被称为一个事件的标志,那Task2在使用的过程中,它就需要来判断flag这个事件的各个位。当然事件的标志还有一些其他的高级标志,比如说你各个位能判断某一个事件,还可以判断一个组合事件,为什么呢?

  比如第一个按键按下了,并且第二个按键也按下了,并且第三个按键也按下了,那你们都按下以后,我才让某个灯亮,那这样的话,我们就可以通过事件标志组来通过各个标志位,来相互的判断,那这个就被称为事件标志组,它不是信号量,但是它还是属于信号量的范畴,这是我们3个任务同步之间的手段。


原文链接:http://www.maiziedu.com/wiki/iot/ucossync/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值