關於計數型信號量

計數型信號量

在事件控制塊中增加了計數器,這個計數器可以表示爲事件發生的次數或者對資源數量的管理。計數信號量有釋放信號量操作和獲取信號量操作,釋放信號量操作的時候計數器的值會加一,獲取信號操作,計數器的值減一,如果減到0任務會進入到等待狀態;具體操作方式有兩種,如下所示:

Wait操作和Notify操作,接下來會詳細描述這兩個操作的具體過程。Wait操作,首先等待計數器的值是否爲大於0,如果大於0,將計數值減一,然後返回。如果不是大於0,則該任務進入到等待狀態;Notify操作,會判斷是否有任務在等待,如果有任務等待則取首個等待的任務喚醒然後返回,如果沒有任務則計數值加一後,返回;

設計原理

設計原理如上圖所示,在事件控制塊中增加一個計數器變量,等待隊列中存放等待的任務,計數變量表示次數。

具體實現獲取和釋放的操作過程

上圖表示計數信號量獲取的過程,判斷計數值是否爲0,如果爲0,將任務增加到等待隊列;如果不爲0,則將計數器減一;

上圖表示計數信號量的釋放過程,判斷隊列中是否有等待的任務,如果有將等待任務釋放;如果沒有,將計數器加一;

實現例程

tTask1實現無超時的等待信號量,tTask2向tTask1發送一個通知;tTask3會超時等待信號量2

實現方法

tSemWait()函數,設置信號量的等待,判斷信號量計數值是否爲0,如果不爲零,減一退出;如果爲零,將任務插入到事件隊列中。

tSemNotify()函數,檢查信號量任務中是否有任務等待,如果有,取出位於等待任務隊列的第一個任務。並將任務加入到就緒隊列的首位。進行任務的切換。

 

實現例程2

tTask1中定義按鍵KEY1,當KEY1按下時,發送tSemNotify函數,在tTask2中,tSemWait()函數無超時等待信號量,任務的系統延時時間爲100ms,具體執行過程如下描述所示:

當key1被按下時,執行tSemNotify函數,此時沒有事件控制塊中沒有任務在等待,所以直接將計數器加一,在按下都是加一;當開始執行tTask2的時候,由於計數器不爲0,所以計數器直接減一後退出,獲得計數器的值,進入到系統延時。只到所有的計數值清0,將任務2加入到信號量1的事件等待控制塊中,當key1被按下,直接喚醒tTask2,繼續重複執行上面的操作。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章