所谓ucos系统任务间的同步,是指两个任务之间要知足某种关系,但没有数据的交互。事件
同步的方案分为3种资源
1)信号量同步
假设这里有两个任务Task1和Task2,第一个任务进行按键的扫描,第二个任务进行LED灯的点亮,假设咱们已经扫描到这个按键已经按下了,按键按下之后,咱们要求LED灯亮,那也就是说咱们的第二个任务永远在等待第一个任务按键的扫描,咱们看一下Task1和Task2之间怎么进行按键的同步,首先Task1一直在检测这个按键是否按下,若是按键按下之后,在这里咱们使用一个全局变量flag,按键按下之后,咱们就设置flag=1,而在Task2当中,不停的检测这个值是多少,flag是否=1,若是=1,就让LED灯亮,而且把flag清零,在这里flag提供的是一个信号量的做用,也就是说Task1按下按键之后,开始向Task2发送一个信号量flag,Task2接收到了flag信号量之后,就把LED灯点亮,因此flag在这里提供的是一个信号量的做用。可是咱们要注意,ucos当中的信号量并非咱们这里写的全局变量,它是一个能够操做的东西。变量
从这里咱们能够看到Task1和Task2它们之间有一个约束,同步关系,可是Task1和Task2之间并无进行一个信息的交互,也就是没有一个数据的交互过程。配置
2)互斥性信号量数据
假设这里仍是有两个任务Task1和Task2,假设这两个任务在运行的过程当中,都须要来访问一个共享的资源,假设要访问一个共享的打印机,假设第一个任务Task1要打印hello,第二个任务Task2要打印world,那咱们很显然能够看到,Task1在使用打印机的时候,Task2是绝对不能使用的,为何呢?co
由于若是Task1在使用打印机,Task2也在使用打印机,那打印出来的数据就再也不是hello world,有可能变成H W E R O等等,这些乱七八糟的数据,为了防止Task1和Task2共同使用打印机,咱们在这里配置的时候就要使用一个约束,假设,咱们仍是使用一个全局变量来表示,用这个flag来表示,flag=1,表示这个打印机处于空闲状态,假设这个时候Task1要使用打印机,它首先要判断flag的状态,若是flag=1,这个时候,它就开始使用打印机,而且把flag=0,一样,假设这个时候,Task2也来使用打印机,它一样要判断flag的状态是否等于1,它一判断这个时候flag=0,它就知道,这个时候打印机处于忙的状态,也就是否是空闲的状态,那它怎么办呢?交互
它就要等待,等待Task1这个任务把咱们的打印机使用完毕,使用完毕之后,它就会把这个flag置为1,这个时候,咱们的Task2这个任务,就能够使用打印机了。在这个地方,咱们能够看到,这个flag充当的是互斥性信号量的做用,什么意思呢?系统
就是Task1和Task2它们两个构成一个互斥关系,就是我在使用的时候,你不能使用,这就是一个互斥性信号量,那么判断flag的状态的语句,被称为获取信号量,或者叫作等待互斥性信号量,就是咱们等待互斥性信号量,当咱们等到之后,就开始使用这个共享资源,使用完毕之后,咱们要发送这个互斥性信号量,flag=1,这个过程就是一个发送互斥性信号量的过程,那一样Task2也是同样的,首先等待这个互斥性信号量,当咱们等到之后,就能够使用这个共享资源,使用完毕共享资源之后,接下来咱们仍是这样发送这个互斥性信号量,因此这个互斥性信号量的使用过程,第一步是等待,第二步是使用,第三步是发送。
3)事件标志组
咱们仍是提供两个任务Task1和Task2,假设Task1仍是进行按键扫描,Task2进行LED灯的点亮,一样的道理,第一个按键按下,LED灯亮,那假设咱们这里的按键它不是一个按键,或者它有N个按键怎么办,它控制的LED也不是一个,而是N个LED,这个时候,咱们仍是使用一个全局变量flag,只不过这个时候,当第一个flag的按键被按下之后,flag的第0位为1,flag的第0位为0,代表第一个没有被按下,一样flag的第1位按键为1,代表第一个按键已经按下,第1位按键为0,代表第一个没有被按下,等等往下来表示。
那也就是说,咱们用flag的各个位来代表了按键按下的状态,那这个时候,咱们的flag已经再也不是一个信号量了,而是一个事件的标志,它的一位标志着一个事件是否发生,好比说第0位为0,代表这个事件没发生,第1位为1,代表这个事件发生了,这个时候这个flag就被称为一个事件的标志,那Task2在使用的过程当中,它就须要来判断flag这个事件的各个位。固然事件的标志还有一些其余的高级标志,好比说你各个位能判断某一个事件,还能够判断一个组合事件,为何呢?
好比第一个按键按下了,而且第二个按键也按下了,而且第三个按键也按下了,那大家都按下之后,我才让某个灯亮,那这样的话,咱们就能够经过事件标志组来经过各个标志位,来相互的判断,那这个就被称为事件标志组,它不是信号量,可是它仍是属于信号量的范畴,这是咱们3个任务同步之间的手段。