STM32的UCOS訊號量和互斥訊號量
二值訊號量作用:任務通過OSSemPend()函式獲得一個訊號量,如果訊號量有效(不為0),則任務繼續執行,否則進入等待狀態。互斥訊號量作用:任務通過OSMutexPend()函式獲得互斥訊號量,如果互斥訊號有效(不為0)則繼續執行,否則進入等待。
那麼他們之間區別在哪?
假設有三個任務A,B,C,他們的優先順序分別為10、20、30,而任務A和C共同使用一個二值訊號量。現在任務C得到訊號進入執行,這時候任務B也進入就緒,由於B優先順序比C高,就會剝奪任務C的CPU控制權,如果這時候任務A需要執行,可是因為訊號量被任務C獲得還沒釋放被任務B掛起,所以A得不到執行,這樣即使任務A優先順序比B高也無法得到執行,這就是優先順序反轉。如果任務A是比較緊急的任務,那麼就會影響實時性。
為了解決二值訊號帶來的這個問題,於是出現了互斥訊號,
它的機制就是:
當一個優先順序較低的任務獲得了一個互斥訊號時,系統會把這個任務的優先順序提高到最高,讓它不被搶佔,這樣這個任務就會更快執行完而釋放互斥訊號提交給更高的任務使用,之後這個任務的優先順序就會回到原來的等級。還是A、B、C舉例,任務C首先得到一個互斥訊號,這時系統會把C的優先順序提高到最高,這樣就不會被B搶佔,從而儘快執行完釋放訊號,之後回到原來優先順序。期間即使A任務需要執行,也能夠儘快得到訊號執行。不過也看出互斥訊號只是緩解了優先順序反轉問題而已,如果任務A很緊急,也還是要等任務C執行完才可以執行,還是沒能很好解決實時性的問題。
互斥訊號量主要是為了解決訊號量出現的優先順序反轉的情況:任務的執行取決於優先順序和獲得訊號量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為刪除的選擇項:立即刪除、等待無任務等待時再刪除。
相關文章
- 互斥鎖和訊號量有什麼不同?(譯)
- 作業系統 訊號量vs互斥鎖作業系統
- Jtti:linux下訊號量和互斥鎖有哪些區別?JttiLinux
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- POSIX 訊號量
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- ZooKeeper 分散式鎖 Curator 原始碼 04:分散式訊號量和互斥鎖分散式原始碼
- liteos訊號量(八)
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- system -v 訊號量的使用
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- 程序間通訊(4)-訊號量
- 10. Semaphore ||(訊號量)
- Linux中訊號量的實現Linux
- Linux中的System V訊號量Linux
- 【freertos】011-訊號量、互斥量及優先順序繼承機制原始碼分析繼承原始碼
- python學習之訊號量Python
- Semaphore訊號量原始碼解析原始碼
- 圖解程式執行緒、互斥鎖與訊號量-看完不懂你來打我圖解執行緒
- Semaphore-訊號量的實現分析
- 【linux】系統程式設計-6-POSIX標準下的訊號量與互斥鎖Linux程式設計
- 原始碼分析:Semaphore之訊號量原始碼
- 附個人工作程式碼 條件變數深度運用、互斥鎖+訊號量變數
- linux中條件變數和訊號量的區別!Linux變數
- Python-訊號量和執行緒池-semaphore ThreadPollPython執行緒thread
- 高薪祕訣,跟著AliOS Things輕鬆入門作業系統:互斥訊號量高薪iOS作業系統
- go中semaphore(訊號量)原始碼解讀Go原始碼
- 畫江湖之 Go 學習篇 【訊號量】Go
- 畫江湖之 Go 學習篇 [訊號量]Go
- Swoole 原始碼分析——鎖與訊號量模組原始碼
- 一文看懂臨界區、互斥鎖、同步鎖、臨界區、訊號量、自旋鎖等名詞!
- 一次訊號量引發的tomcat異常退出Tomcat
- 程式間通訊——基於共享記憶體和訊號量實現共享佇列記憶體佇列
- Bold訊號與fNIRS訊號的區別
- 高可用之限流-03-Semaphore 訊號量做限流
- rt-thread學習筆記——8、建立訊號量thread筆記
- 2.3.2 訊號量機制——作業系統筆記作業系統筆記
- 用STM32定時器測量訊號頻率——測頻法和測周法[原創cnblogs.com/helesheng]定時器