信號量的理解

1. 信號量的理解
(1)uc/os-ii的信號量是由兩個部分組成:一部分是16位的無符號整型信號量的計數值(0~65535);另一部分是等待該信號量的任務組成的等待任務表。(另外參考事件控制塊ECB)
(2)信號量可以是2值的變量(稱爲二值信號量),也可以是計數式的。根據信號量的值,內核跟蹤那些等待信號量的任務。
(3)建立信號量的工作必須在任務級代碼中或者多任務啓動之前完成。
(4)任務要得到信號量的問題。
想得到信號量的任務,必須執行等待操作(pend)。如果信號量有效(非0),則信號量減1,任務得以繼續運行。如果信號量無效,則等待信號量的任務就被列入等待信號量的任務表中。多少內核允許定義等待超時,當等待時間超過了設定值,該信號量還是無效,則等待該信號量的任務進入就緒態,準備運行,並返回出錯代碼(等待超時錯誤)。
(5)任務對信號量的釋放問題。
任務執行發信號(post)操作來釋放信號量。如果沒有任務等待信號量,那麼信號量的值僅是簡單的加1(則信號量大於0,有效);如果有任務等待該信號量,那麼就會有另一個任務進入就緒態,信號量的值就不加1。
之後,這個釋放的信號量給那個等待中的任務,要看內核如何調度的。收到信號量的任務可能是如下兩者之一:
◆等待任務中,優先級最高的;(uc/os-ii僅支持這種方式)。
◆最早開始等待信號量的任務(如果是按先進先出FIFO原則)。
 
2. 信號量的有效與無效問題
信號量有效:信號量的計算器非0(.OSEventCnt!=0)。信號量有效表示任務對資源可用。
信號量無效:信號量的計算器爲0。信號量無效表示任務對目前資源不可用,需要等待其他另一個任務(或者中斷服務子程序)發出該信號量(OSSemPost)。
3. 信號量的值(.OSEventCnt)大小表示什麼?
二值信號量,表示任務可以獨佔共享資源。
計數式信號量,用於某資源可同時爲N個任務所用。
4. 信號量是如何實現任務之間的通信的?
參見第1點的(4)(5)概述。
5. 信號量有關的三個重要函數分析
◆OSSemCreate() 創建一個信號量   (注:由任務或啓動代碼操作)
創建工作必須在任務級代碼中或者多任務啓動之前完成。功能只要是先獲取一個事件控制塊ECB,寫入一些參數。其中調用了OS_EeventWaitListInt()函數,對事件控制塊的等待任務列表進行初始化。完成初始化工作後,返回一個該信號量的句柄(Handle)。
 
◆OSSemPend() 等待一個信號量 (注:只能由任務操作)
本函數應用於任務試圖獲得共享資源的使用權、任務需要與其他任務或中斷同步及任務需要等待特定事件發生的場合。
如果任務Task_A調用OSSemPend(),且信號量的值有效(非0),那麼OSSemPend()遞減信號量計數器(.OSEventCnt),並返回該值。換句話說,Task_A獲取到共享資源的使用權了,之後就執行該資源。
如果如果任務Task_A調用OSSemPend(),信號量無效(爲0),那麼OSSemPend()調用OS_EventTaskWait()函數,把Task_A放入等待列表中。(等待到什麼時候呢?要看OSSemPost()(或者等待超時情況),由它釋放信號量並檢查任務執行權,見下資料)
 
◆OSSemPost() 發出(釋放)一個信號量 (注:由任務或中斷操作)
本函數其中調用OS_EventTaskRdy()函數,把優先級最高的任務Task_A(在這假如是Task_A,另外假設當前調用OSSemPost()的任務是Task_B)從等待任務列表中去除,並使它進入就緒態。然後調用OSSched()進行任務調度。如果Task_A是當前就緒態中優先級最高的任務,則內核執行Task_A;否則,OSSched()直接返回,Task_B繼續執行.

----------------------------------------------------------------
  互斥型信號量
1.互斥型信號量(mutex)
       互斥型信號量具備uc/os-ii信號量的所有機制,但還具有其他一些特性。
       任務可利用互斥型信號量來實現對共享資源的獨佔處理。
     Mutex是二值信號量,1表示資源是可以使用的。
 
2.關於優先級反轉
    下面概述優先級反轉原理:
       假設有三個任務,分別命名爲A,B,C;A的優先級最高,C的優先級最低。任務A和任務B處於掛起狀態(請注意這條件),等待某一事件的發生,任務C正在運行。當任務C等待到共享資源(命名爲S1)並使用後,如果任務A等待得事件到來之後,由於A的優先級最高,所以就會剝奪任務C的CPU使用權。運行過程中,任務A也要使用資源S1,但S1的信號量還被任務C佔用着,所有任務A只能進入掛起狀態,等待任務C對S1的信號量的釋放。此時任務C得以繼續運行。
       同理,任務B的事件到來後,會剝奪任務C的CPU使用權。任務B把事情搞定以後,把CPU使用權歸還給任務B(呵呵,優先級低就是給人欺負啊,所以做人還真的要爭口氣!)。任務B又得以繼續運行,任務B認真處理完畢資源S1後,終於可以釋放S1的信號量。而處於等待該信號量的任務A馬上得到信號量並開始處理共享資源S1。
    綜述上面情況,任務C和任務A的優先級發生了反轉。
       而互斥型信號量就是具有解決優先級反轉問題的特性。


3.uc/os-ii的互斥型信號量由三個部分組成:
       ◆一個標誌,指示mutex是否可以使用(0或1)
◆一個優先級,準備一旦高優先級的任務需要這個mutex,賦予給佔有mutex的任務。
◆一個等待該mutex的任務列表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章