µc/os-ii 中的訊號量由兩部分組成:乙個是訊號量的計數值,它是乙個 16 位的無符號整數(0 到65,535之間) ;另乙個是由等待該訊號量的任務組成的等待任務表。 使用者要在 os_cfg.h中將os_sem_en開關量常數置成1,這樣µc/os-ii 才能支援訊號量。
當訊號量不為0時,任務即可獲得訊號量。
訊號量常用於以下幾個場合:
1、標誌共享資源的使用權(互斥條件)。
2、標誌事件的發生
3、使兩個任務的行為同步
1、os_event *ossemcreate (int16u cnt) 建立乙個訊號量,初始化為cnt,並且返回訊號量控制代碼。如果訊號量是用來表示乙個或者多個事件的發生,那麼該訊號量的初始值應設為 0。如果訊號量是用於對共享資源的訪問,那麼該訊號量的初始值應設為1(例如,把它當作二值訊號量使用)。最後,如果該訊號量是用來表示允許任務訪問n個相同的資源,那麼該初始值顯然應該是 n,並把該訊號量作為乙個可計數的訊號量使用。
2、void ossempend (os_event *pevent, int16u timeout, int8u *err) 等待乙個訊號量,pevent為訊號量控制代碼,timeout為等待超時時間,err為執行結果。若訊號量不為0,呼叫該函式以後訊號量自動減1,呼叫者獲得訊號量。當訊號量為0時,任務進入睡眠狀態,等待訊號量。
3、int8u ossempost (os_event *pevent) 傳送訊號量,pevent為訊號量控制代碼,返回值為執行結果,若正確執行則返回os_no_err,若訊號量溢位則返回os_sem_ovf。正確執行該函式後,訊號量自動加1。
4、int16u ossemaccept (os_event *pevent) 無等待的獲取訊號量。pevent為訊號量控制代碼,返回值為獲取後訊號量大小。若訊號量暫時無效,函式立即返回。
5、int8u ossemquery (os_event *pevent, os_sem_data *pdata) pevent為訊號量控制代碼,pdata為訊號量資訊資料結構。返回值為執行結果。
ucos 計數訊號量
1 計數訊號量 1.1 建立訊號量 當事件控制塊os event中的oseventtype os event type sem時,則表示此處建立的事件為訊號量。上面為計數訊號量的建立函式,建立函式不能在中斷中呼叫,在全域性的事件控制塊列表中取出乙個事件控制塊pevent,對pevent進行初始化操作...
ucos訊號量理解1
本文主要來自 ucos中提供了好幾個用於同步事件以及共享資源訪問的機制,目前我看明白的有訊號量,互斥訊號量,事件標誌組。下面談談自己對他們的理解 互斥互斥,意思就是我用了你就不能用,你用了我就不能用。永遠都只有乙個人獨佔這個東西 舉個例子 比如說印表機。我任務1現在讓他列印 靜夜思 那麼在我還沒列印...
ucos訊號量訊息佇列
全域性變數 static int msg int os q data msg 訊息佇列主任務 void start task void p arg led任務0 void led0 task void p arg if err os err none ostimedlyhmsm 0,0,3,0,os...