跳轉到內容

微處理器設計/即時作業系統

來自華夏公益教科書

即時作業系統

[編輯 | 編輯原始碼]

即時作業系統 (RTOS) 是一種多工作業系統,用於為即時應用程式請求提供服務。它必須能夠在資料到來時處理資料,通常沒有任何緩衝延遲。RTOS 廣泛應用於我們周圍的產品中,從軍事、消費類到科學應用。RTOS 是許多嵌入式系統中使用的作業系統,因為它在允許即時應用程式更輕鬆地設計和擴充套件的同時,還能滿足所需的效能要求。

它包含兩個元件:“即時”和“作業系統”。“即時”表示作業系統必須在執行的關鍵操作中以及高可靠性情況下在確定的時間內做出響應。因此,RTOS 是一種支援即時應用程式和嵌入式系統的作業系統,它透過在所需期限內提供邏輯上正確的結果來實現。這些功能定義了其確定性計時行為和有限資源利用率的性質。

即時作業系統的分類

[編輯 | 編輯原始碼]

RTOS 通常分為三種類型

  1. 硬即時:對錯過截止日期的容忍度極低或為零。錯過截止日期會導致系統出現災難性後果。
  2. 韌體即時:錯過截止日期可能會導致質量下降無法接受。
  3. 軟即時:可以錯過截止日期,並且可以從錯過截止日期中恢復。系統質量下降是可以接受的。

即時作業系統的特點

[編輯 | 編輯原始碼]

一個基本的 RTOS 將具備以下功能

  • 多工和搶佔

RTOS 必須是多工的和可搶佔的,以支援即時應用程式中的多個任務。排程程式應該能夠搶佔系統中的任何任務,並在峰值負載下將資源分配給最需要它的任務。

  • 任務優先順序

搶佔定義了識別最需要資源的任務並將其分配給獲取資源的控制能力。在 RTOS 中,這種能力是透過為每個任務分配適當的優先順序來實現的。

  • 可靠且充足的任務間通訊機制

為了使多個任務能夠及時通訊並確保彼此之間的資料完整性,需要可靠且充足的任務間通訊和同步機制。

  • 優先順序繼承

為了允許實現具有嚴格優先順序要求的應用程式,RTOS 在使用優先順序排程時必須具有足夠數量的優先順序級別。

  • 預定義的短延遲

RTOS 需要對其系統呼叫的時間有準確的定義。

  • 記憶體管理控制

為了確保對中斷的可預測響應,RTOS 應該提供一種方法讓任務將其程式碼和資料鎖定到真實記憶體中。

即時作業系統架構

[編輯 | 編輯原始碼]

即時作業系統的架構取決於其部署的複雜性。優秀的 RTOS 可擴充套件以滿足不同應用程式的不同需求。對於簡單的應用程式,RTOS 通常只包含一個核心。對於更復雜的嵌入式系統,RTOS 可以是各種模組的組合,包括核心、網路協議棧和其他元件。

即時作業系統與通用作業系統

[編輯 | 編輯原始碼]

許多非即時作業系統也提供類似的核心服務。通用計算作業系統和即時作業系統之間的關鍵區別在於即時作業系統需要“確定性”計時行為。正式地說,“確定性”計時意味著作業系統服務僅消耗已知且預期的時間。理論上,這些服務時間可以用數學公式表示。這些公式必須是嚴格的代數公式,不包含任何隨機計時元件。服務時間中的隨機元素會導致應用程式軟體中的隨機延遲,進而導致應用程式隨機錯過即時截止日期——對於即時嵌入式系統來說,這顯然是不可接受的場景。

通用計算非即時作業系統通常非常不確定。它們的服務會嚮應用程式軟體注入隨機延遲,從而導致應用程式在意外的時間出現響應緩慢。如果你要求非即時作業系統開發人員提供描述其其中一項服務計時行為的代數公式(例如,從一個任務向另一個任務傳送訊息),你將永遠不會得到一個代數公式。相反,非即時作業系統(如 Windows、Unix 或 Linux)的開發人員只會對你感到困惑。確定性計時行為根本不是這些通用計算作業系統的設計目標。

另一方面,即時作業系統通常比基本確定性更進一步。對於大多數核心服務,這些作業系統提供了恆定負載無關的計時。

即時作業系統中的核心

[編輯 | 編輯原始碼]
“kernel” – the part of an operating system that provides the most basic services to application software running on a processor.  

即時作業系統 (“RTOS”) 的“核心”提供了一個“抽象層”,它嚮應用程式軟體隱藏了應用程式軟體將執行的處理器(或一組處理器)的硬體細節。在提供此“抽象層”時,RTOS 核心嚮應用程式軟體提供了五類基本服務。

  1. 最基本的核心服務類別,位於最中心,是任務管理。
  2. 第二類核心服務是任務間通訊與同步。
  3. 許多 RTOS 核心提供動態記憶體分配服務。
  4. 許多 RTOS 核心還提供“裝置 I/O 管理器”類別的服務。
  5. 除了核心服務外,許多 RTOS 還提供許多可選的附加作業系統元件,用於提供檔案系統組織、網路通訊、網路管理、資料庫管理、使用者介面圖形等高階服務。

任務排程

[編輯 | 編輯原始碼]

大多數 RTOS 使用一種名為“基於優先順序的搶佔式排程”的方案來排程任務。它基本上為每個程序分配一個優先順序,如果在任何時間點,排程程式執行準備執行的最高優先順序程序。每個程序都執行到完成,除非被搶佔。排程程式負責在任務之間進行 CPU 時間共享。每次基於優先順序的搶佔式排程程式收到來自外部世界的觸發器(如開關閉合)或軟體觸發器(如訊息到達)的提醒時,它都必須執行以下 5 個步驟

  1. 確定當前正在執行的任務是否應該繼續執行。
  2. 如果不是,確定哪個任務應該接下來執行。
  3. 儲存已停止的任務的環境(以便它稍後可以繼續執行)。
  4. 設定接下來執行的任務的執行環境。
  5. 允許此任務執行。

這 5 個步驟一起被稱為"任務切換"

固定時間任務切換

[編輯 | 編輯原始碼]

在評估作業系統時,完成任務切換所需的時間是一個重要的考量因素。一個簡單的通用計算(非搶佔式)作業系統可能只在計時器滴答的時候進行任務切換,例如每隔十毫秒。因此,如果在 10 毫秒內需要進行任務切換,實際的任務切換將只在當前 10 毫秒週期結束時進行。這種延遲在大多數即時嵌入式系統中是不可接受的。

實際上,"即時"並不意味著 "儘可能快";而意味著 "即時"需要一致、可重複、已知的定時效能。雖然非即時作業系統可能對少量任務執行一些更快的任務切換,但它也可能在下次執行相同任務切換時引入較長的延遲。即時作業系統的優勢在於它已知、可重複的定時效能,這通常也比非確定性任務排程器在軟體系統中存在大量任務的情況下的效能更快。通常情況下,當任務數量超過 5 或 10 個時,即時作業系統比其非即時競爭對手錶現出快得多的任務切換時間。

任務間通訊和同步

[編輯 | 編輯原始碼]

大多數作業系統,包括 RTOS,都提供各種機制來實現任務之間的通訊和同步。這些機制在多個任務的搶佔式環境中是必要的,因為沒有它們,任務可能會傳遞錯誤的資訊或以其他方式相互干擾。

例如,一個任務可能在更新資料表的中途被搶佔。如果一個搶佔它的第二個任務從該表中讀取資料,它將讀取一部分新更新的資料和一部分尚未更新的資料。這些更新和舊的資料區域組合在一起可能不正確,或者甚至可能沒有意義。RTOS 提供的任務間通訊和同步機制是為了避免這些型別的錯誤。大多數 RTOS 提供多種機制,每種機制都針對從任務到任務可靠地傳遞不同型別的資訊進行了最佳化。嵌入式系統中任務間最常見的通訊方式可能是從一個任務傳遞資料到另一個任務。大多數 RTOS 提供一種訊息傳遞機制來執行此操作。每條訊息可以包含一個數據陣列或緩衝區。

確定性和高速訊息傳遞

[編輯 | 編輯原始碼]

任務間訊息通訊是不同作業系統表現出不同計時特性的另一個領域。大多數作業系統實際上在透過訊息佇列從任務傳遞訊息時會複製兩次訊息。第一次複製是從訊息傳送任務到作業系統擁有的 RAM 記憶體 "秘密" 區域,第二次複製是從作業系統 "秘密" RAM 區域到訊息接收任務。顯然,這在時間上是不確定的,因為這些複製活動隨著 訊息 長度的增加而花費更長時間。一種避免這種不確定性並加速效能的方法是讓作業系統複製訊息的指標並將該指標傳遞給訊息接收任務,而不移動訊息內容。為了避免訪問衝突,作業系統隨後需要返回到訊息傳送任務並刪除其對訊息指標的副本。對於大型訊息,這消除了對冗長複製的需要,並消除了不確定性。

動態記憶體分配

[編輯 | 編輯原始碼]

動態記憶體分配是指執行程式請求作業系統分配給它一塊主記憶體。程式然後使用這塊記憶體來執行某些操作。服務時間的確定性也是動態分配 RAM 記憶體領域的一個問題。許多通用計算非即時作業系統提供來自所謂的 "堆" 的記憶體分配服務。堆會遭受一種稱為 "外部記憶體碎片" 的現象,這會導致堆服務效能下降。外部碎片是指空閒記憶體被分成小塊,並且與分配的記憶體交織在一起。這是某些儲存分配演算法的弱點,因為它們未能有效地排序程式使用的記憶體。結果是,雖然有空閒儲存可用,但實際上是不可用的,因為它被分成單個太小而無法滿足應用程式要求的碎片。

可以透過 "垃圾收集"(碎片整理)軟體解決這種碎片問題。不幸的是,"垃圾收集" 演算法通常是極度不確定的 - 在堆服務中注入隨機出現的隨機持續時間的延遲。這些通常在通用計算非即時作業系統的記憶體分配服務中看到。

即時作業系統透過完全避免記憶體碎片和 "垃圾收集" 以及它們帶來的後果來解決這種延遲問題。RTOS 提供非碎片記憶體分配技術,而不是堆。它們透過限制提供給應用程式軟體的記憶體塊大小的種類來做到這一點。雖然這種方法不如記憶體堆的方法靈活,但它們確實避免了外部記憶體碎片,並避免了對碎片整理的需求。

華夏公益教科書