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的時候,任務就無法再獲取了,并且獲取的任務會進入阻塞態
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。