新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 信號量專題

        信號量專題

        作者: 時間:2016-09-12 來源:網絡 收藏

        1. 信號量

        本文引用地址:http://www.104case.com/article/201609/304508.htm

        (1)uc/os-ii的信號量是由兩個部分組成:一部分是16位的無符號整型信號量的計數值(0~65535);另一部分是等待該信號量的任務組成的等待任務表。(另外參考事件控制塊ECB)

        (2)信號量可以是2值的變量(稱為二值信號量),也可以是計數式的。根據信號量的值,內核跟蹤那些等待信號量的任務。

        (3)建立信號量的工作必須在任務級代碼中或者多任務啟動之前完成。

        (4)任務要得到信號量的問題。

        想得到信號量的任務,必須執行等待操作(pend)。如果信號量有效(非0),則信號量減1,任務得以繼續運行。如果信號量無效,則等待信號量的任務就被列入等待信號量的任務表中。多少內核允許定義等待超時,當等待時間超過了設定值,該信號量還是無效,則等待該信號量的任務進入就緒態,準備運行,并返回出錯代碼(等待超時錯誤)。

        (5)任務對信號量的釋放問題。

        任務執行發信號(post)操作來釋放信號量。如果沒有任務等待信號量,那么信號量的值僅是簡單的加1(則信號量大于0,有效);如果有任務等待該信號量,那么就會有另一個任務進入就緒態,信號量的值就不加1。

        之后,這個釋放的信號量給那個等待中的任務,要看內核如何調度的。收到信號量的任務可能如下:

        ◆等待任務中,優先級最高的;(uc/os-ii僅支持這種方式)。

        ◆等待任務中所有等待該信號量的任務

        2. 信號量的有效與無效問題

        信號量有效:信號量的計算器非0(.OSEventCnt!=0)。信號量有效表示任務對 資源可用。

        信號量無效:信號量的計算器為0。信號量無效表示任務對目前資源不可用,需 要等待其他另一個任務(或者中斷服務子程序)發出該信號量

        3. 信號量的值(.OSEventCnt)大小表示什么?

        ①二值信號量,表示任務可以獨占共享資源。

        ②計數式信號量,用于某資源可同時為N個任務所用。

        4. 信號量有關的三個重要函數分析

        ◆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繼續執行。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 囊谦县| 衡阳县| 津南区| 黎平县| 昌黎县| 石楼县| 江津市| 宜宾市| 平陆县| 青铜峡市| 雷州市| 仙居县| 张家港市| 天镇县| 闽侯县| 渝中区| 水富县| 宣汉县| 寿光市| 同江市| 姚安县| 杨浦区| 章丘市| 牡丹江市| 肇源县| 扎赉特旗| 色达县| 麻城市| 旺苍县| 云梦县| 平泉县| 海丰县| 东阳市| 长治市| 西华县| 永宁县| 喀喇沁旗| 隆德县| 梁平县| 永仁县| 玛沁县|