UCOS學習筆記——信號量

信號量

信號量的基本概念

信號量(Semaphore)是一種實現任務間通信的機制,可以實現任務之間同步或臨界資源的互斥訪問。
信號量是一個“鎖定機構”, 代碼需要獲得鑰匙纔可以訪問共享資源。 佔用該資源的任務不再使用該資源並釋放資源時, 其它任務才能夠訪問這個資源 。
抽象的來講信號量是一個非負整數,所有獲取它的任務都會將該整數減一其值的含義分兩種情況:
0:表示沒有積累下來的釋放信號量操作,且有可能有在此信號量上阻塞的任務。
正值:表示有一個或多個釋放信號量操作。

信號量的類型

通常有兩種類型的信號量:二值信號量和多值信號量。二值信號量的值只能是 0 或 1.多值信號量計數值可以是 0 到 4294967295(依賴於計數值是 8 位, 16 位或 32 位)。特別的, uC/OS-III 中的信號量計數值最大爲 OS_SEM_CTR(見 OS_TYPE.H)。根據信號量計數值,uC/OS-III 可以知道有該信號量可以再被多少個任務獲得。

二值信號量

二值信號量既可以用於臨界資源訪問也可以用於同步功能
用作同步時,信號量在創建後應被置爲空,任務1獲取信號量而進入阻塞,任務2在某種條件發生後,釋放信號量,於是任務1獲得信號量得以進入就緒態,如果任務1的優先級是最高的,那麼就會立即切換任務,從而達到了兩個任務間的同步。同樣的,在中斷服務函數中釋放信號量,任務1也會得到信號量,從而達到任務與中斷間的同步。

計數信號量

常將計數信號量用於事件計數與資源管理。每當某個事件發生時,任務或者中斷將釋放一個信號量(信號量計數值加1),當處理被事件時(一般在任務中處理),處理任務會取走該信號量(信號量計數值減1),信號量的計數值則表示還有多少個事件沒被處理。
注意:只有任務才允許使用信號量,ISR是不允許的。

信號量應用場景及運作機制

應用場景

同步:任務與任務、中斷與任務間同步
計數:用於資源統計,比如當前任務來了很多個消息,但是這些消息都放在緩衝區中,尚未處理,這時候就可以利用計數信號量對這些資源進行統計,每來一個消息就加一,每處理完一個消息就減一,這樣子系統就知道有多少資源未處理的

運行機制

二值信號量運行機制:在這裏插入圖片描述
計數信號量運行機制:在這裏插入圖片描述

與信號量相關的API函數

當信號量被用於共享資源時,信號量相關函數只能被任務調用(絕不能被 ISR 調用)。但將信號量用於標記任務時可以被 ISR 調用
在這裏插入圖片描述
簡單介紹:
OSSemCreate()創建一個信號量,將信號量地址傳遞給函數的第一個參數。信號量必須在創建後才能被其他任務使用

用OSSemPend()函數等待一個信號量。 任務必須指定所等待的信號量,且這個信號量之前已經被創建 。據信號量的創建結果 OSSemPend()返回一個錯誤代號。如果信號量創建成功, 錯誤代號爲 OS_ERR_NONE。 如果創建失敗,錯誤代號會包含錯誤的原因。 當 OSSemPend()正確返回時,任務就可以訪問這個共享資源。

資源訪問結束後, 任務調用 OSSemPost()釋放這個信號量。 當信號量有效的時候,任務才能獲取信號量,當任務獲取了某個信號量的時候,該信號量的可用個數就減下,當它減到0的時候,任務就無法再獲取了,並且獲取的任務會進入阻塞態

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