新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于μC/OS-II的中斷下半部設計方案

        基于μC/OS-II的中斷下半部設計方案

        作者: 時間:2011-08-08 來源:網絡 收藏

        μC/OS—II是一個針對微控制器和嵌入式應用而的輕量級實時操作系統,通過了美國聯邦航空管理局符合RTCA D0178B標準的認證。這表明μC/OS—II能用于與人性命攸關的、安全性條件極為苛刻的系統。由于其輕量級的,源代碼開放和優秀的實時性能等諸多優點,成為了眾多嵌入式開發者的首選。

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

          層次化的處理機制實質上是一種可以使開發者在處理時盡量縮短屏蔽時間,提高異步事件響應的機制。μC/OS—II的者Jean J.Labrosse在其著作中談到:實時內核最重要的指標就是中斷關了多長時間。所以為了幫助開發者合理設計中斷服務程序,以使其嵌入式系統獲得最好的實時性,μC/OS—II有必要實現層次化的中斷處理機制。本文將從分析μC/OS—II的中斷處理入手,介紹通過引入中斷下來實現層次化的中斷處理機制的設計和實現方法,并通過在ARM7處理器上的測試來說明這種機制的引入對于提高系統實時性的意義。

          1 中斷下的設計

          目前,在μC/OS—II內核中任務的運行空間分為中斷空間和任務空間。中斷空間即為中斷服務程序運行所處的空間,這時處理器執行中斷服務程序,而所有任務(task)都被處于被中斷態。對很多處理器而言,在中斷空間內中斷請求是被屏蔽的。中斷下的引入將中斷空間一分為二,如圖1所示。中斷的上半部為中斷服務程序,執行那些有嚴格時限要求不能被打斷的工作;中斷的下半部執行那些在中斷上半部被延后,允許被中斷的工作。中斷上半部和下半部都應有自己獨立的棧空間,二者不會干擾。

          μC/0S—II已經設計了完善的中斷服務程序的入口和出口函數,所以為了實現中斷上半部和下半部的銜接,要從μC/0S—II的中斷出口函數OSintExit()著手進行修改。修改后的OSIntExit()實現的功能將是:退出中斷的上半部,檢查中斷下半部是否有就緒的服務程序,若有則在允許中斷的情況下執行中斷下半部的處理函數,若沒有則進行任務調度恢復處理器到任務空間執行。

          中斷下半部的核心是中斷下半部的管理函數OSDo-Sirq()。它的功能是檢查中斷下半部的狀態變量,依據優先級順序選擇就緒的下半部服務程序順序執行,并且對相應的下半部狀態進行修改,最后跳轉到下半部的出口函數。出口函數OSSirqExit()使處理器完成從中斷空間到任務空間的轉換。至此,中斷服務全部完成,用戶任務得以繼續執行。

          本設計使用softirq來指中斷下半部的服務程序。中斷下半部支持最多32個具有不同靜態優先級的softirq。中斷優先級范圍為0~31,O是最高優先級,31是最低優先級。這里引入了優先級的思想,因為上半部服務程序可能需要對應的softirq來完成延后的任務,類似的softirq也應有不同的優先級來標識它們先后的運行順序。而采用靜態實現的目的是為了實時性和穩定性的考慮,若采用動態實現,代價是可能產生內存碎片和更多的處理器資源損耗。每一個softirq都有對應的標志變量來標識它的使能、屏蔽和就緒的狀態。一組具有明確功能定義的API用于softirq的注冊、屏蔽和使能等功能。

          一般情況下,中斷服務程序是不會重入的,因為絕大多數處理器會在中斷執行時禁止中斷,至少是禁止同級和更低優先級的中斷。本設計的中斷下半部同樣不要求softirq具有可重入性,因為在下半部的實現中已通過巧妙的設計消除了重入的可能性。softirq遵循μC/OS—II對編寫中斷服務程序的限制要求,例如中斷服務函數不能執行可能會導致任務阻塞的函數等,在此不再贅述。

          2 中斷下半部的實現

          操作系統設計全局的考慮,中斷下半部的實現應遵循以下幾點原則:

          ①中斷下半部也將運行于中斷空間,這意味著任務空間的所有任務都要被阻塞。中斷下半部與中斷上半部(即中斷服務程序)一個根本的不同是:中斷下半部允許中斷。

          ②盡量對原μC/0S—II體系結構做最小化的修改,如任務調度機制、任務空間的各種保護和同步機制等。改動所涉及的范圍越大,引入bug的可能性也越大。在所增加的代碼中盡量利用原μC/0S—II提供的系統調用,如開關中斷還有任務調度等函數,這樣兼顧了效率和安全性。

          ③盡量減少使用平臺相關性代碼,保證μC/OS—II的可移植性。

          ④設計簡潔明確的API接口,以方便其他開發者能夠輕松使用這種機制。

          根據中斷下半部的設計,其實現分為以下4個主要的模塊。

          2.1 中斷下半部入口的實現

          μC/OS—II核心代碼os_core.c中的OSIntExit()函數是μC/OS—II中斷處理程序的出口。為了實現中斷下半部的入口,應將OSIntExit()函數中if((OSIntNesting=0)(OSLockNesting==O))語句以下列代碼來代替:

          第1條if語句判斷是否所有中斷服務程序都已經結束,注意這里也包括softirq。因為在進入下半部管理函數后會執行OSIntNesting++,若softirq正在執行則OSInt-Nesting一定大于O。這個簡單的if判斷語句消除了soft—irq的重入的可能性。判斷條件為真后,繼續判斷全局變量softirq_flag,若其值為SOFTIRQ_ENABLE則啟用中斷下半部。全局變量softirq_stat可能的值有3個:

          ①SOFTIRQ_READY,說明有就緒的softirq等待運行;

          ②SOFTIRQ_RUNNING,說明softirq正在被調度但其狀態可能為被中斷態;

          ③SOFTIRQ_NONE,說明沒有softirq處于就緒狀態。

          此判斷語句條件為真時,函數OSIntCallSirq()將會保存被中斷任務的上下文,初始化中斷下半部堆棧指針,并執行下半部管理函數OSDo-Sirq()。若判斷結果為假,則中斷處理返回被中斷的語句繼續執行。而這條語句可能為中斷下半部的代碼,也可能為任務空間的代碼。0S—IntCallSirq()是一段具有平臺相關性的匯編代碼,在不同的處理器平臺上有不同的實現代碼,其流程如圖2所示。

        0S—IntCallSirq()流程


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大洼县| 拜城县| 探索| 藁城市| 衡山县| 庆元县| 阳城县| 齐河县| 合阳县| 斗六市| 鞍山市| 诸暨市| 兴山县| 铜梁县| 澄迈县| 柳江县| 武定县| 贺州市| 周口市| 嫩江县| 清徐县| 酉阳| 且末县| 松桃| 博爱县| 陵川县| 墨竹工卡县| 克山县| 囊谦县| 隆回县| 东乌| 宁波市| 大渡口区| 沛县| 宜昌市| 广元市| 乌鲁木齐市| 塔河县| 林口县| 宜黄县| 鄄城县|