基于RTAI的嵌入式Linux硬實時性能的研究與實現
0 引言
Linux是一種能運行于多種平臺、源代碼公開、免費、功能強大、遵守POSIX標準、與Unix兼容的操作系統。隨著嵌入式系統的不斷發展和應用,嵌入式Linux操作系統也在各方面得到了廣泛的應用。但是,作為通用操作系統的Linux,要應用在嵌入式領域,需要作必要的改進。在電能質量監控等對實時性要求較高的領域,需要將最初按照分時系統目標設計的Linux改造成能支持硬實時性的操作系統。
uClinux操作系統是Linux操作系統的一個嵌入式變種,它作為一種優秀的嵌入式操作系統具有很好的穩定性和優異的網絡性能,但是它的實時性差,尤其不支持硬實時任務的特點卻極大地限制了其應用。本文利用RTAI對uClinux的實時性進行了擴展,并應用于電能質量監控實驗平臺,對系統改造前后的實時性能進行了對比分析。
1 嵌入式Linux的實時性分析和擴展
實時系統分為兩類,分別為軟實時(Soft Real-Time)和硬實時(Hard Real-Time)。軟實時是統計意義上的實時,并不能保證特定的任務在特定的時間內完成,即便是處理時間超過了截止時間,結果也是有意義的。而硬實時是時間要求必須嚴格保證的實時,如果系統對某個實時任務的處理未能在某個截止時間開始或者結束的話,會產生不可預料的后果。因此,硬實時才是真正意義上的實時。Linux雖然也可采取基于優先級的調度策略,并且也將進程分為實時進程和非實時進程,但是Linux的以下幾點特征決定了其本身很難完成硬實時的任務:
1)Linux的內核是不可搶占的。如果Linux的核心態進程在運行時,其他進程不管優先級多高都需要等待處于核心態的系統調用返回后才能執行。
2)為了保護臨界區資源,互斥的訪問臨界區,Linux采用在臨界區操作時屏蔽中斷的方式,這抑制了系統及時響應外部操作的能力。
3)Linux內核(2.6版本以前)采用了較大時間粒度的定時器,時鐘中斷周期為10ms,加大了任務響應的延遲,無法滿足對時間精度要求苛刻的實時應用。
目前實現Linux系統的硬實性的方法,依據是否對Linux的內核進行大規模修改,可以大致分為兩類:對內核進行大規模修改的兼容內核方法和對內核進行小規模改動的雙內核方法。后者由于對內核改動小,效果明顯且遵守GPL得到了更加廣泛的推廣。它在Linux內核之外,以可加載內核模塊(Loadable Kernel Module)的形式添加實時內核,并用該實時內核接管來自硬件的所有中斷,并依據是否是實時任務決定是否直接響應。這種方法的代表就是新墨西哥州立大學的FSM實驗室推出的RT-Linux和由意大利米蘭理工學院航天工程系發起的RTAI。
2 RTAI的實現機制
RTAI是實時應用接口Real Time Application Interface的縮寫。它在Linux上定義了一組實時硬件抽象層RTHAL(Real Time Hardware Abstraction Layer),RTHAL將所有需要的Linux內部數據和函數的指針集合到一個rthal的結構中。Rthal結構用于截取Linux硬件操作,在雙內核結構工作時,它們可以被RTAI重定向,以取代Linux中原有的函數;同時RTAI只是用此程序界面與Linux進行溝通。通過這種方法就可以把對 Linux內核源碼的改動程度降到最低,可以避免RT-Linux方案對Linux內核源碼改動過大的問題,便于在不同Linux版本之間的移植。
RTAI嚴格來說只是一個具備了操作系統核心功能的實時的系統內核,它接管了所有的硬件資源,將Linux操作系統內核作為它的一個低優先級的任務來運行。RTAI 是一個完全的占先式內核,它具備了實時操作系統的諸多特性,如實時的中斷響應,任務對事件的實時響應,細粒度的原子操作等。在RTAI/Linux雙內核結構下,實時性的任務在RTAI的調度下運行,非實時性和需要利用完善的操作系統功能的任務在Linux調度下運行。由于Linux操作系統在RTAI下具有的優先級很低,當且僅當RTAI沒有實時任務調度時,Linux才能夠得到運行。RTAI/Linux雙內核結構如圖1所示。
圖1 RTAI/Linux雙內核結構圖
Fig1 Architecture of the RTAI/Linux system
RTAI以Linux的內核模塊的形式運行,提供雙內核的實時服務。最基本的兩個模塊是rtai_module和 rtai_sched_module,另外還有三個增強功能的模塊rtai_fifos_module、rtai_shm_module和 rtai_lxrt_module。
rtai_module是一個核心模塊,RTHAL在這一模塊里實現,完成對硬件的接管。以關硬件中斷行為為例說明,Linux系統中原有的關中斷函數#define _cli_asm_volatile_(“cli”:::”memory”)直接通過匯編語言對硬件進行操作,而在rtai_module模塊中,Linux中的關中斷函數被替換為執行{processor[hard_cpu_id()].intr_flag = 0;}。可見,Linux關中斷的執行只是改變了RTAI中的中斷標志位,并沒有直接對硬件進行操作。
相關推薦
-
-
-
-
-
-
-
-
primarykey | 2013-06-25
-
eduxu | 2015-06-23
-
-
評論