傳送乙個訊號量, OSSemPost

2021-07-29 17:26:08 字數 810 閱讀 8994

程式清單 l6.11是ossempost()函式的源**。它首先檢查引數指標pevent指向的任務控制塊是否是ossemcreate()函式建立的[l6.11(1)],接著檢查是否有任務在等待該訊號量[l6.11(2)]。如果該任務控制塊中的.oseventgrp域不是0,說明有任務正在等待該訊號量。這時,就要呼叫函式oseventtaskrdy()[見6.02節,使乙個任務進入就緒狀態,oseventtaskrdy()],把其中的最高優先順序任務從等待任務列表中刪除[l6.11(3)]並使它進入就緒狀態。然後,呼叫ossched()任務排程函式檢查該任務是否是系統中的最高優先順序的就緒任務[l6.11(4)]。如果是,這時就要進行任務切換[當ossempost()函式是在任務中呼叫的],準備執行該就緒任務。如果不是,ossched()直接返回,呼叫ossempost()的任務得以繼續執行。如果這時沒有任務在等待該訊號量,該訊號量的計數值就簡單地加1[l6.11(5)]。

上面是由任務呼叫ossempost()時的情況。當中斷服務子程式呼叫該函式時,不會發生上面的任務切換。如果需要,任務切換要等到中斷巢狀的最外層中斷服務子程式呼叫osintexit()函式後才能進行(見3.09節,µc/os-ii中的中斷)。

程式清單 l6.11 發出乙個訊號量

int8u ossempost (os_event *pevent)

os_enter_critical();

if (pevent->oseventtype != os_event_type_sem) else else {

os_exit_critical();

return (os_sem_ovf);

等待乙個訊號量, OSSemPend

程式清單 l6.10是ossempend 函式的源 它首先檢查指標pevent所指的任務控制塊是否是由ossemcreate 建立的 l6.10 1 如果訊號量當前是可用的 訊號量的計數值大於0 l6.10 2 將訊號量的計數值減1 l6.10 3 然後函式將 無錯 錯誤 返回給它的呼叫函式。顯然,...

C 實現乙個訊號量

訊號量有很多應用場景,事實上只要是生產者 消費者模型,一般都需要乙個訊號量來控制。posix介面是有pv訊號量api的。但c 標準沒有。下面是乙個pv訊號量的簡單實現。有些不熟悉條件變數的人或許產生下面的疑問 1 wait裡已經對mtx加鎖並阻塞了,notify那裡申請mtx的行為豈不是一直等待?條...

訊號量學習總結(一)

訊號量學習總結 一 訊號量是一種用於如果不同程序間或乙個給定程序的不同執行緒間同步的原語。建立乙個新的有名訊號量或開啟乙個已存在的有名訊號量。sem t sem open const char name,int oflag sem t sem open const char name,int ofl...