天天看點

Linux實作強實時性的需求與方法

  過去很多嵌入式系統不是一個作業系統,或者是提供商的專有核心,或者是DOS作業系統的擴充。顯然這些方法并不能适應今天嵌入式系統開發的要求!現有的一些商業實時作業系統,盡管提供了很小的核心和多任務開發環境,但性能并不理想,也不符合現在實時嵌入式市場的需求。

  

  是以,人們把目光投向了通用作業系統(例如Windows、Solaris、linux),希望把它們“改造”為實時作業系統。通常這些作業系統功能強大,結構複雜,易于軟體的二次開發,實用性強,并且提供程式設計人員熟悉的标準API。此外,這些作業系統也提供了一些對實時軟體開發的支援。然而,這些作業系統用于嵌入式系統的開發還存在不足。嵌入式系統要求具備高可靠性,滿足應用需求的可剪裁性,以及比通用作業系統要求更高的實時性。

  

  做為嵌入式系統開發的解決方案,linux在衆多通用作業系統中具有獨一無二的優勢。

  

  首先,Windows和Solaris等專有商業作業系統的剪裁受到商家的嚴格控制。這大大限制了開發者的剪裁深度。而linux遵循GPL協定,開放所有系統源代碼,非常易于剪裁。

  其次,同其它開放源碼的通用作業系統(如FreeBSD)相比,linux在多種處理器、開發闆支援和軟體開發工具支援上有很強的優勢。

  linux最初也是作為通用作業系統而設計開發的,但提供了一些實時處理的支援。這包括支援大部分POSIX标準中的實時功能,支援多任務、多線程,具有豐富的通信機制等。

  

  linux還提供符合了POSIX标準的排程政策,包括FIFO排程政策、時間片輪轉排程政策和靜态優先級搶占式排程政策。其預設的排程政策是第三種。Linux還提供了記憶體鎖定功能,以避免在實時進行中存儲頁被換出,也提供了符合POSIX 标準的實時信号機制。

  一個緻命問題是,linux在使用者态支援可搶占排程政策,而在核心态卻不支援搶占式排程政策。這樣運作在Linux核心态的任務(或系統調用)是不能被其它優先級更高的任務所搶占的,這樣就會引起優先級逆轉問題。另外,Linux作業系統的中斷處理句柄是不可排程的,不能依優先級高低。

  此外,我們還關心和任務響應時間相關的時鐘精度,以及由于資源共享而帶來的優先級逆轉問題。linux中硬體時鐘中斷的預設時間間隔是10ms,所有的軟體時鐘都是靠硬體來觸發的。而簡單同步機制(互斥)不支援優先級繼承又很可能導緻優先級逆轉。

獨立核方法

  linux作為實時系統的獨立核方法是指設計一種完全獨立的實時核心,但其API 與Linux核心相相容。這種方法的理論基礎是一款優秀的實時作業系統必須在其設計之初就充分考慮到系統實時性的要求,并能夠提供符合标準的API。這種實作方法對很多與POSIX相容的專有實時系統提供商很有吸引力。

  這種方法的局限性是由于設計了一個完全獨立的實時核心而沒有使用原有linux核心,導緻Linux系統的一些優勢難以繼承,尤其是與Linux核心相關的一些優勢無法獲得。比如Linux核心對大量硬體的廣泛支援,Linux核心超群的可靠性、穩定性等。另外,由于這種方法并沒有通過修改Linux核心代碼來開發實時核心,而是在Linux系統之上重新設計了一個實時核心,這樣的開發并不要求源代碼開放。是以,Linux一些基于開放源代碼的優勢也勢必受損。最後一點,任何基于Linux核心的開發成果也無法友善地應用到實時核心中。

  當然這種實作方法也從linux系統中得到了很多好處。由于Linux系統的支撐,實時核心就并不需要“真”的去實作。而且熟悉Linux系統的開發人員也可以很快地熟悉這種方法開發出的實時系統。人們也會自然地想到用Linux系統做嵌入式系統的開發平台。此外,如果這種實時系統的API是Linux系統API子集的話,我們還可以隻在Linux主機上仿真,進行應用程式的開發和調試,免去了遠端調試之苦!

  與linux API的相容程度是評估這類實時系統的一個重要名額。如果一個實時系統相容了所有Linux API,那麼就允許所有Linux上的應用程式和庫在其上運作使用。是以,這将會帶來一個巨大的好處,所有在Linux上可用的第三方軟體均可以在其上使用。當然,開發一款這樣相容所有Linux API的實時系統決不是件容易的事,尤其是對于單個開發商來說。

  是以,大量的第三方軟體并不能很容易地移植到實時系統中來,這點不足,也使linux的優勢大打折扣!

雙核方法

  這種方法在同一硬體平台上采用了兩個互相配合,共同工作的系統核心,一個核心提供精确的實時多任務管理,另一個核心提供複雜的非實時通用功能。

  這種方法是通過在linux作業系統的最底層增加一層實時核心層來實作的。實時核心負責硬體管理并提供實時任務管理。實時核心還用軟體“模拟”正常Linux系統對底層硬體的使用/禁止中斷,而不是真正的操作中斷控制寄存器。Linux核心被看做實時核心中優先級最低的任務來排程,隻有當沒有可運作的實時任務時Linux核心才被排程。

  這種方法的一個關鍵所在是運作在正常linux核心上的所有非實時任務必須是支援可搶占式排程的。這樣才能做到對實時核心提供精确實時保證沒有任何影響。由于實時核心非常小,并不會增加整個系統的負載,所有這些對開發實時性要求嚴格的實時軟體都提供了有力保障。

  這種方法的弊端在于實時任務的開發是直接面向提供精确實時服務的小實時核心的,而不是功能強大的正常linux核心。是以,實時任務是運作在系統核心層的,這就意味着這些實時任務可以運作在沒有記憶體保護的級别之上。是以,一個實時任務的錯誤可能會導緻整個系統的癱瘓!更要命。

  這種開發模式暗示我們必須要對應用進行靜态分解。把它分解成實時部分和非實時部分。在大多情況下,這是件好事情。它迫使開發人員将應用系統分解成實時子系統和非實時子系統兩部分。但很顯然,使用這種開發模式也限制了應用的類型!因為,這種用二進制論觀點看待實時系統的方法并不适合所有的應用。在一些應用中,實時部分和非實時部分的界線并不是十分分明,期間可能存在着不同程度的軟實時部分。

  這種方法的另一個不足之處是,開發模式混合了實時應用的兩個不相幹次元——功能需求和實時需求。它要求應用的實時需求必須限制于由實時核心提供的功能需求限度以内。而實時核心提供的功能支援非常有限。當然我們也可以擴充實時核心的功能,比如增加實時網絡功能等。然而,新增加的部分很有可能會重疊linux核心已有功能,而導緻了不必要的系統“膨脹”,并折損這種方法的價值。

修改核方法

  這種方法是基于已有linux系統對實時軟體開發的支援,進行源代碼級修改而使Linux變成一個真正的實時作業系統。這種方法也是和Linux哲學相吻合的。任何基于Linux核心源代碼修改的産品,都要遵循GPL協定,對所有軟體人員開放源代碼。一旦很多人認為它是有用的,就會有人對它進行維護,或者是混合在通用Linux核心中,或者是單獨分出一個實時Linux分支。

  這種方法的中心原則是精心選擇部分改動,就可以滿足一系列相關linux實時開發。此外,由于這些改動都是相對局部的,不會從根本上改變Linux的核心。而且一些改動還可以通過正常Linux的可加載子產品方式完成。在需要時系統可以動态加載該功能子產品,在不需要時還可以動态解除安裝該子產品比如,修改之一是核心搶占式排程。把核心從非搶占式變成搶占式是結構上的大變動,并可能引起很多問題,但很多問題已經在linux支援SMP 的時候解決了。是以,核心的搶占式修改就可以簡單地利用SMP挂鈎。另一個修改點是前面提到過的使中斷處理句柄可排程。還有一些修改是全局的,例如修改系統時鐘服務來提供更高精度的“心跳”,而不增加不必要的系統負載,或者是提供在核心實作互斥機制來支援優先級繼承。

資源核方法

  這種方法是為解決傳統實時作業系統中固定優先級搶占式排程政策的局限性而産生的。固定優先級搶占式排程算法沒有任務間的臨時保護。是以,可預見的任務響應時間依賴于對所有更高優先級任務執行時間的預測。在這樣的系統中,可預見性是與全局相關的,并且可能被一個糟糕任務而影響的。此外,這種用靜态觀點看待實時系統也是不妥的。在很多實時應用中,更希望實時系統可以根據應用程式獲得資源動态地調整任務屬性,以求得到最優效果。

繼續閱讀