摘要:研究了如何提高嵌入式實時操作系統的實時性和可靠性問題。
關鍵詞:嵌入式實時操作系統 實時性 可靠性 搶占式調度 微內核 中斷
中圖分類號:TP316.2 文獻標識碼:A 文章編號:1002-2422(2008)04-0005-02
1 搶占式調度
在嵌入式實時操作系統(RTOS)中,線程按照其優先級順序執行。如果一個高優先級的線程準備運行時,將在一個短的、有限時間間隔內從任何可能正在運行的低優先級進程接管CPU。另外,高優先級的線程能夠不被中斷地運行,直到已經完成了需要做的事情。這種方法就是搶占式調度,保證了高優先級線程始終滿足其最終期限。
保證高優先級的進程和線程的同時確保不會使其它進程處于“饑餓”狀態的關鍵是要執行進程限制。通過對執行進程調整或在響應加載的過程中進程控制,開發人員能夠限制這些活動消耗的CPU時間比例,并支持低優先級進程獲得對CPU的共享。
搶占式調度僅在高優先級線程在一個短的、有限時間段內搶占低優先級線程的情況下有效,否則系統將不可能預測要花費多長時間來執行一個給定的操作。
可以將線程看作是最小的“執行單元”,而將進程看作是一個或多個線程的“容器”,進程定義了線程將要在其中執行的地址空間。將所有的線程放在幾個大的進程中將是錯誤的,因為線程提供的切換速度更快。雖然線程能實現并行處理優勢因而適合于某些設計,但是將一個應用分成多個內存保護的進程使得代碼更容易調試,提供了更好的錯誤隔離和恢復能力,并允許系統進行新功能的動態升級。
2 可搶占的內核
在RTOS中,內核操作是可搶占的。盡管仍然會存在一些時間窗口,在這些時間窗口中可能沒有搶占,但這些時間間隔應該是相當短暫的,通常在幾百納秒。另外必須有一個關于搶占被推遲或中斷被禁止的時間上限,這樣開發者可以確定最壞情形下的等待時間。
為實現此目標,操作系統內核需盡可能簡潔,只有具有較短執行路徑的服務才被包含在內核中,任何需大量工作的操作必須被安排到外部進程或線程。這種方法有助于通過內核確保最長的不可搶占代碼路徑具有一個時間上限。
2.1 優先級繼承
假定系統有三個進程見圖1:A、B、C,現假定A已經請求C執行一個計算,而在這期間,B突然需要C的服務。因為B擁有比A更高的優先級,所以一般會認為C將立即掛起A的請求并將轉向為B服務,但是實際情況并非如此,因為C比B具有更高的優先級,所以B不能阻止C完成當前的工作。
從效果上看,低優先級的進程A占用了更高優先級進程B的CPU時間,這是引入優先級繼承的原因。通過使用RTOS提供的優先級繼承機制,系統可以在A發出請求的情況下,讓C繼承A的低優先級。通過這種方式,B能夠在任何時候搶占A的請求。
如果一個應用程序分布于幾個通過網絡連接的處理器,那么RTOS也應該支持分布式優先級繼承,這樣可以按照優先級的順序處理來自多個處理器的請求。如果沒有優先級繼承,一個多處理器系統可能會落入無限的優先級倒置和死鎖中。
2.2 中斷處理
為了獲得對外部事件的及時響應,將最小化硬件中斷發生到執行該中斷的第一條代碼的時間很重要。這個時間間隔稱為中斷延遲,為了保證中斷延遲盡可能小,RTOS應該在幾乎所有時間內都支持產生中斷。
3 如何提高可靠性
提高RTOS的可靠性的關鍵取決于RTOS的架構。例如在實時執行模式架構中,大部分或所有軟件組件都在一個單一的內存地址空間中運行,包括操作系統內核、網絡協議棧、設備驅動程序、應用程序等。雖然這種架構的效率較高,但有兩個明顯的缺陷:(1)任何組件中的一個指針錯誤,都可能破壞操作系統內核或任何其它組件,導致不可預測的行為和整個系統的崩潰。(2)很難動態修復或替換任何有故障的組件,大多數情況下,出現這些問題時系統復位是唯一的選擇。
有一些RTOS試圖通過使用單內核架構來解決這個問題。在這種架構中,用戶的應用程序在隔離的、受保護內存地址空間中運行(見圖2)。如果一個應用程序試圖訪問其地址空間之外的數據,內存管理單元(MMU)將通知操作系統,操作系統可能會采取保護措施,例如終止出錯進程。由于這樣的操作系統需要將大多數或所有驅動程序、文件系統和其它系統服務綁定到內核中,因此任何組件中的一個錯誤都可能帶來災難性的內核故障。

采用微內核(mricokemel)架構可提供更精確的故障隔離,如QNX Neutrino等操作系統都基于微內核架構。微內核有兩個明確的特征:(1)在操作系統內核中只實現了一個包含了基本OS服務的小內核(如信號量、定時器、任務調度等),包括驅動程序、文件系統、協議棧和用戶應用程序在內的所有其它的組件在內核外部分離的、保護內存的進程中運行。有問題的系統服務不再作為孤立的故障點,而是在破壞其它服務或操作系統內核之前被終止并重啟。(2)所有的組件能夠通過消息傳遞進行通信,一個定義良好的通信機制保障了程序在保持彼此安全隔離的前提下進行數據交換。適當實現的消息傳遞也可以作為一個虛擬的“軟件總線”,允許任何的軟件組件,甚至是一個設備驅動程序被動態地加入或替換,對于必須提供連續服務的系統而言這是一項關鍵要求。
基于消息傳遞的微內核RTOS通常提供了更好的容錯性和動態升級能力。在實際應用中,如果實現正確,消息傳遞的性能可以接近底層硬件的內存帶寬。例如,一個微內核RTOS可以采用多段式消息和線程到線程的消息數據直接拷貝等各種技術,來確保系統性能可以達到傳統的進程間通信方法的水平。