(轉)ucos的事件 任務的通訊和同步 訊號量 互斥量 訊息郵箱 訊息佇列
阿新 • • 發佈:2019-02-18
() 使一個等待超時的任務進入就緒狀態
事件控制塊連結串列也有空和工作中的2種區分,類似於任務控制塊,就不多說了
七、訊號量詳細
重要組成:型別 cnt 訊號量指標為空 控制塊
1.建立訊號量
OSSemCreat(cnt)------------設定型別 設定初始化計數 設定指向緩衝區為空 初始化事件控制塊 返回訊號量指標
2.請求訊號量
OSSemPend(訊號量指標 時限 錯誤資訊) 訊號量無效時,任務會等待
OSsemAccept(訊號量) 訊號量無效時,任務直接繼續執行
3.釋放訊號量
OSSemPost(訊號量指標)
4.刪除訊號量
OSSemDel(訊號量名、條件選項、錯誤資訊)
5.查詢訊號量狀態
OSSemQuery()
八、優先順序反轉和互斥量
優先順序反轉:ab等待狀態,c執行;c最低優先順序,在c沒有釋放訊號量的情況下,a運行了,那a會等待,然後c運行了在釋放訊號量之前有個任務b運行了,那b只得在a之前運行了。好像b的優先順序比a高了。
出現這種情況是因為低優先順序的任務使用訊號量的過程中被打斷,不能釋放訊號量。
解決方法就是c使用訊號量的時候提高優先順序(因為在使用訊號量比a的優先順序要高),釋放訊號量再恢復原來的優先順序。
九、互斥量
任務可用互斥量,來實現對資源的獨佔
資料型別要為互斥量型別 cnt分為高8位元組和低8位元組,低8位0xff表示訊號有效,高8位記錄了臨時的提升的優先順序。
1.建立互斥量
OSMutexCreat(提升的優先順序 錯誤資訊)
2.請求互斥量
OSMutexPend(互斥量指標 超時 錯誤資訊)
OSMutexAccept(互斥量指標 錯誤資訊) 互斥量無效任務會繼續執行
3.釋放互斥量
OSMutexPost(互斥量指標)
4.獲取互斥量的當前狀態
OSMutexQuery(互斥量指標 儲存的資料結構)
5.刪除互斥量
OSMutexDel(互斥量指標 直接刪除還是等待任務執行完刪 錯誤資訊)
十、訊息郵箱
1.OSMboxCreat(msg)
訊息郵箱 :設定型別為訊息郵箱型別;設定指標為空,或指向緩衝區;設定cnt為0;初始化ECB
2.OSMboxPost(訊息郵箱的指標, 訊息緩衝區指標)
傳送訊息郵箱
事件控制塊連結串列也有空和工作中的2種區分,類似於任務控制塊,就不多說了
七、訊號量詳細
重要組成:型別 cnt 訊號量指標為空 控制塊
1.建立訊號量
OSSemCreat(cnt)------------設定型別 設定初始化計數 設定指向緩衝區為空 初始化事件控制塊 返回訊號量指標
2.請求訊號量
OSSemPend(訊號量指標 時限 錯誤資訊) 訊號量無效時,任務會等待
OSsemAccept(訊號量) 訊號量無效時,任務直接繼續執行
3.釋放訊號量
OSSemPost(訊號量指標)
4.刪除訊號量
OSSemDel(訊號量名、條件選項、錯誤資訊)
5.查詢訊號量狀態
OSSemQuery()
八、優先順序反轉和互斥量
優先順序反轉:ab等待狀態,c執行;c最低優先順序,在c沒有釋放訊號量的情況下,a運行了,那a會等待,然後c運行了在釋放訊號量之前有個任務b運行了,那b只得在a之前運行了。好像b的優先順序比a高了。
出現這種情況是因為低優先順序的任務使用訊號量的過程中被打斷,不能釋放訊號量。
解決方法就是c使用訊號量的時候提高優先順序(因為在使用訊號量比a的優先順序要高),釋放訊號量再恢復原來的優先順序。
九、互斥量
任務可用互斥量,來實現對資源的獨佔
資料型別要為互斥量型別 cnt分為高8位元組和低8位元組,低8位0xff表示訊號有效,高8位記錄了臨時的提升的優先順序。
1.建立互斥量
OSMutexCreat(提升的優先順序 錯誤資訊)
2.請求互斥量
OSMutexPend(互斥量指標 超時 錯誤資訊)
OSMutexAccept(互斥量指標 錯誤資訊) 互斥量無效任務會繼續執行
3.釋放互斥量
OSMutexPost(互斥量指標)
4.獲取互斥量的當前狀態
OSMutexQuery(互斥量指標 儲存的資料結構)
5.刪除互斥量
OSMutexDel(互斥量指標 直接刪除還是等待任務執行完刪 錯誤資訊)
十、訊息郵箱
1.OSMboxCreat(msg)
訊息郵箱 :設定型別為訊息郵箱型別;設定指標為空,或指向緩衝區;設定cnt為0;初始化ECB
2.OSMboxPost(訊息郵箱的指標, 訊息緩衝區指標)
傳送訊息郵箱