UCOSII 訊號量的使用

2021-08-09 09:49:46 字數 1351 閱讀 2996

訊號量的使用

使用訊號量之前首先要對訊號量有乙個本質的認識

(1)訊號量的含義:訊號量是一類事件,使用訊號量的最初目的是為了給共享資源  設

立乙個標誌,該標誌表示共享資源的占用情況,這樣,當乙個任務在訪問共

享資源之前,就可以對這個標誌進行查詢,從而在了解資源被占用的情況之後

,再來決定自己的行為。

(2)ucos-ii的訊號量裡面有乙個oseventcnt,正確的認識這個,是使用訊號量的關

鍵。ossemcreate(0)  :這種情況下可以用任務的同步。

ossemcreate(1)  :這種情況類似於互斥訊號量,有乙個名字就是二值訊號

量,可用於乙個資源的使用

ossemcreate(>1) :這種情況表示有》1個資源可以使用。

(3)oseventcnt的初始資料代表可用的資源數,1就是乙個可用資源,n就是n可用資

源。 (4)下面分兩種情況進行詳細的討論 

a.ossemcreate(0) 這種情況下用於訊號的同步

post訊號。 

a)如果在規定的時間內收到訊號,那麼任務將通過ossempend將其從等待

列表刪除,繼續執行。

b)如果延時超時,那麼將通過ossempend函式本身將其從事件等待列表刪除

b.ossemcreate(1) 這種情況下用於互斥訊號量,但不能防止優先順序翻轉。

詳細實現同上。

c.ossemcreate(>1) 這種情況下用多個資源共享

詳細實現同上。

os_eventtaskremove(ostcbcur, pevent); 

只是把任務從任務就緒列表裡面移除,加入到事件等待列表

訊號量的使用還是很簡單的

我現在主要將其用在兩個方面

(1)用來觸發乙個事件的發生。

semp 

=  ossemcreate(0); 

//建立乙個訊號量

else  }

} err = ossempost(semp); 

//這個函式用來釋放乙個訊號量

if (err == os_err_none) //也就是觸發上面的那個函式 

(2)用來獨佔乙個資源,這個的使用要小心,防止優先順序的反轉,所以最好使用這兩個資源的任務之間不要有別的優先順序,有的話就容易發生優先順序的反轉情況,這種情況是不允許的。

ossempend(semp, 500, &err);

//在這裡新增需要使用的資源

ossempost(semp);

ucos ii 訊號量的使用

訊號量使用主要涉及三個函式 ossemcreat ossempend ossempost 第乙個負責建立乙個訊號量,同時需要的引數是設定訊號量的值 第二個是等待該訊號量,當訊號量值為0時,將呼叫改函式的任務加入該訊號量的等待任務列表 中,當訊號量值大於0時,該函式緊緊將訊號量值減1 第三個函式負責置...

uCOS II訊號量學習

ucos ii學習環境的建立可以參考這個帖子 1 相關背景知識 訊號量為作業系統處理臨界區問題和程序間同步提供了一種有效的機制。訊號量本身不具備資料傳輸的功能,它只是資源的外部標識,通過該標識可以判斷該資源是否可用。訊號量在此過程中負責資料操作的互斥 同步等功能。訊號量的行為常用p操作和v操作來表示...

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...