互斥信號量主要是為了解決信號量出現的優先級反轉的情況:任務的運行取決於優先級和獲得信號量2個條件,並且獲得信號量又優先於設定的優先級。剝奪性內核對信號量進行獨占訪問,就有可能出現先獲得信號量的低優先級任務在獨占信號量過程中被高優先級任務剝奪CPU控制權而掛起,不能及時釋放信號量,而高優先級任務又需要該信號量從而出現優先級反轉。
解決的辦法:引入互斥信號量,在任務獲得共享信號量過程中提升置最高優先級不被打斷(通過將信號量計數器分成高8位作為提升優先級,低8位作為占用標志0XFF表明未占用),從而使低優先級任務及時釋放共享信號量。其它與信號量相同。
一創建互斥信號量: OS_EVENT *OSMutexCreat(INT8U prio,INT8U &err)//從任務鏈表中取得一個任務控制塊賦值類型為OS_Event_TYPE_MUXTEX,然后給任務計數器的高8位賦值優先級,第八位賦值0XFF表明未被占用。
二申請互斥信號量:void OSMutexPend(OS_EVENT *P, INT16U timeout,INT8U &err)//訪問任務計數器若為0xff則獲得運行權,否則進入等待列表,timeout用於指定等待時間。
OSMutexAccept(OS_EVENT *P,INT8U &err)//無等待的請求一個信號量。
三發送(釋放)互斥信號量:INT8U OSMutexPost(OS_EVENT *P)
四獲得互斥型信號量的當前狀態:INT8U OSMutexQuery(OS_EVENT *P,OS_MUTEX_DATA *pdata)//需事先定義一個存儲互斥型信號量狀態的變量。
五刪除互斥型信號量:OS_EVENT *OSMutexDel(OS_EVENT *P, INT8U opt,INT8U &err)//opt為刪除的選擇項:立即刪除、等待無任務等待時再刪除。