Ucos中任務間的同步如何實現?

所謂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個任務同步之間的手段。

相關文章
相關標籤/搜索