實時操作系統的概念


實時操作系統的概念

實時系統的特點是,如果邏輯和時序出現偏差將會引起嚴重后果的系統。能夠對外界事件和數據作出快速處理並快速響應。

有兩種類型的實時系統:軟實時系統和硬實時系統。

  1.在軟實時系統中系統的宗旨是使各個任務運行得越快越好,並不要求限定某一任務必須在多長時間內完成。

  2.在硬實時系統中,各任務不僅要執行無誤而且要做到准時。

  大多數實時系統是二者的結合。多數實時系統又是嵌入式的。

這意味着計算機建在系統內部,用戶看不到有個計算機在系統里面——嵌入式。

一 前后台系統

  應用程序是一個無限的循環,循環中調用相應的函數完成相應的操作,這部分可以看成后台行為(background)。

  中斷服務程序處理異步事件,這部分可以看成前台行為(foreground)。

  后台也可以叫做任務級。前台也叫中斷級

  時間相關性很強的關鍵操作(Critical operation)一定是靠中斷服務來保證的

因為中斷服務提供的信息一直要等到后台程序走到該處理這個信息這一步時才能得到處理,這種系統在處理信息的及時性上,比實際可以做到的要差。

 

 

二 不可剝奪型內核(Non-Preemptive Kernel)

  不可剝奪型內核要求每個任務自我放棄CPU 的所有權。不可剝奪型調度法也稱作合作型多任務,各個任務彼此合作共享一個CPU。

  異步事件還是由中斷服務來處理。中斷服務可以使一個高優先級的任務由掛起狀態變為就緒狀態。

  但中斷服務以后控制權還是回到原來被中斷了的那個任務,直到該任務主動放棄CPU 的使用權時,那個高優先級的任務才能獲得CPU的使用權。

  運行着的任務占有CPU,而不必擔心被別的任務搶占。


任務級響應時間要大大好於前后系統,但仍是不可知的要等當前任務執行完畢,商業軟件幾乎沒有不可剝奪型內核。

 

三 可剝奪型內核

  當系統響應時間很重要時,要使用可剝奪型內核。最高優先級的任務一旦就緒,總能得到CPU 的控制權。

  當一個運行着的任務使一個比它優先級高的任務進入了就緒態,當前任務的CPU 使用權就被剝奪了,

或者說被掛起了,那個高優先級的任務立刻得到了CPU 的控制權。

  如果是中斷服務子程序使一個高優先級的任務進入就緒態,中斷完成時,中斷了的任務被掛起,優先級高的那個任務開始運行。

 

使用可剝奪型內核,最高優先級的任務什么時候可以執行,任務之間切換發生的概率是較高的,存在資源競爭情況發生。

四 實時操作系統基本概念

1 代碼臨界段

  代碼的臨界段也稱為臨界區,指處理時不可分割的代碼。

一旦這部分代碼開始執行,則不允許任何中斷打入。為確保臨界段代碼的執行,在進入臨界段之前要關中斷,而臨界段代碼執行完以后要立即開中斷。

2 任務

  一個任務,也稱作一個線程,是一個簡單的程序,該程序可以認為CPU 完全只屬該程序自己。

實時應用程序的設計過程,包括如何把問題分割成多個任務,每個任務都是整個應用的某一部分,

每個任務被賦予一定的優先級,有它自己的一套CPU 寄存器和自己的棧空間。

 

典型地、每個任務都是一個無限的循環。

 

  休眠態相當於該任務駐留在內存中,但並不被多任務內核所調度。

  就緒態意味着該任務已經准備好,可以運行了,但由於該任務的優先級比正在運行的任務的優先級低,還暫時不能運行。

  運行態的任務是指該任務掌握了CPU 的控制權,正在運行中。

  掛起狀態也可以叫做等待事件態WAITING,指該任務在等待,等待某一事件的發生,

(例如等待某外設的I/O 操作,等待某共享資源由暫不能使用變成能使用狀態,等待定時脈沖的到來或等待超時信號的到來以結束目前的等待,等等)。

  中斷時,CPU 提供相應的中斷服務,原來正在運行的任務暫不能運行,就進入了被中斷狀態。

 

3 任務切換

  當多任務內核決定運行另外的任務時,它保存正在運行任務的當前狀態(Context),即CPU 寄存器中的全部內容。

  這些內容保存在任務的當前狀況保存區(Task’sContext Storage area),也就是任務自己的棧區之中。

  入棧工作完成以后,就是把下一個將要運行的任務的當前狀況從該任務的棧中重新裝入CPU 的寄存器,並開始下一個任務的運行。這個過程叫做任務切換。

  任務切換過程增加了應用程序的額外負荷。CPU的內部寄存器越多,額外負荷就越重。做任務切換所需要的時間取決於CPU 有多少寄存器要入棧。

4內核

  多任務系統中,內核負責管理各個任務,或者說為每個任務分配CPU 時間,並且負責任務之間的通訊。內核提供的基本服務是任務切換。

  之所以使用實時內核可以大大簡化應用系統的設計,是因為實時內核允許將應用分成若干個任務,由實時內核來管理它們。

  內核本身也增加了應用程序的額外負荷,代碼空間增加ROM 的用量,內核本身的數據結構增加了RAM的用量。

  但更主要的是,每個任務要有自己的棧空間,這一塊吃起內存來是相當厲害的。內核本身對CPU 的占用時間一般在2 到5 個百分點之間。

  單片機一般不能運行實時內核,因為單片機的RAM 很有限。

通過提供必不可缺少的系統服務,諸如信號量管理,郵箱、消息隊列、延時等,實時內核使得CPU 的利用更為有效。

5 調度

  調度(Scheduler),英文還有一詞叫dispatcher,也是調度的意思。這是內核的主要職責之一,就是要決定該輪到哪個任務運行了。

  多數實時內核是基於優先級調度法的。每個任務根據其重要程度的不同被賦予一定的優先級。

基於優先級的調度法指,CPU 總是讓處在就緒態的優先級最高的任務先運行。然而,究竟何時讓高優先級任務掌握CPU 的使用權,

  有兩種不同的情況,這要看用的是什么類型的內核,是不可剝奪型的還是可剝奪型內核。

 

6 可重入性(Reentrancy)

  可重入型函數可以被一個以上的任務調用,而不必擔心數據的破壞。可重入型函數任何時候都可以被中斷,一段時間以后又可以運行,而相應數據不會丟失。

  可重入型函數或者只使用局部變量,即變量保存在CPU 寄存器中或堆棧中。如果使用全局變量,則要對全局變量予以保護。

  不可重入型函數使用任務間公共性的資源,例如:全局變量

  假定使用的是可剝奪型內核,中斷是開着的,Temp 定義為整數全程變量。

int Temp;   //全局變量

void swap(int *x, int *y)

{

Temp = *x;

*x = *y;

*y = Temp;

}

 

將會發生情況:

 

使用以下技術之一即可使Swap()函數具有可重入性:

        把Temp 定義為局部變量

        調用Swap()函數之前關中斷,調動后再開中斷

        用信號量禁止該函數在使用過程中被再次調用

7任務優先級

  每個任務都有其優先級。任務越重要,賦予的優先級應越高。

  靜態優先級

    應用程序執行過程中諸任務優先級不變,則稱之為靜態優先級。在靜態優先級系統中,諸任務以及它們的時間約束在程序編譯時是已知的。

  動態優先級

    應用程序執行過程中,任務的優先級是可變的,則稱之為動態優先級。實時內核應當避免出現優先級反轉問題。

  時間片調度

    當兩個或兩個以上任務有同樣優先級,內核允許一個任務運行事先確定的一段時間,叫做時間額度(quantum),然后切換給另一個任務。也叫做時間片調度。

 

優先級反轉

      

優先級繼承

        

8 互斥條件

  當所有到任務都在一個單一地址空間下,能使用全程變量、指針、緩沖區、鏈表、循環緩沖區等,使用共享數據結構通訊就更為容易。

  雖然共享數據區法簡化了任務間的信息交換,但是必須保證每個任務在處理共享數據時的排它性,以避免競爭和數據的破壞。與共享資源打交道時,使之滿足互斥條件

  最一般的方法有:

   關中斷

   使用測試並置位指令:事件

   禁止做任務切換

   利用信號量:多值信號量,互斥信號量

 

使用信號量可以實現任務間的同步或者任務與中斷間的同步。

9 任務間的通訊

  任務間的或中斷服務與任務間的通訊。任務間信息的傳遞有兩個途徑:通過全程變量或發消息給另一個任務。

全程變量:

  任務只能通過全程變量與中斷服務程序通訊。任務並不知道什么時候全程變

  量被中斷服務程序修改了,除非中斷程序以信號量方式向任務發信號或者是該任務以查詢方式不斷周期性地查詢變量的值。

消息郵箱:

       要避免這種情況,用戶可以考慮使用郵箱或消息隊列。

通過內核服務,一個任務或一個中斷服務程序可以把一則消息(即一個指針)放到郵箱里去。一個或多個任務可以通過內核服務接收這則消息。

 

消息隊列:

  消息隊列實際上是郵箱陣列

 

10 中斷

  中斷是一種硬件機制,用於通知CPU 有個異步事件發生了。中斷一旦被識別,CPU 保存部分(或全部)現場(Context)即部分或全部寄存器的值,

跳轉到專門的子程序,稱為中斷服務子程序(ISR)。中斷服務子程序做事件處理,處理完成后,程序回到:

        在前后台系統中,程序回到后台程序

        對不可剝奪型內核而言,程序回到被中斷了的任務

        對可剝奪型內核而言,讓進入就緒態的優先級最高的任務開始運行

 

11 存儲器

  總代碼量= 應用程序代碼+ 內核代碼

  因為每個任務都是獨立運行的,必須給每個任務提供單獨的棧空間(RAM)。應用程序設計人員決定分配給每個任務多少棧空間時,

應該盡可能使之接近實際需求量(有時,這是相當困難的一件事)。

  棧空間的大小不僅僅要計算任務本身的需求(局部變量、函數調用等等),還需要計算最多中斷嵌套層數(保存寄存器、中斷服務程序中的局部變量等)。

根據不同的目標微處理器和內核的類型,任務棧系統棧可以是分開的。

  系統棧專門用於處理中斷級代碼。這樣做有許多好處,每個任務需要的棧空間可以大大減少。

  內核的另一個應該具有的性能是,每個任務所需的棧空間大小可以分別定義(μC/OS-II 可以做到)。

  相反,有些內核要求每個任務所需的棧空間都相同。所有內核都需要額外的棧空間以保證內部變量、數據結構、隊列等

 

除非有特別大的RAM 空間可以所用,對棧空間的分配與使用要非常小心。為減少應用程序需要的RAM 空間,對每個任務棧空間的使用都要非常小心,特別要注意以下幾點:

  1. 定義函數和中斷服務子程序中的局部變量,特別是定義大型數組和數據結構
  2. 函數(即子程序)的嵌套
  3. 中斷嵌套
  4. 庫函數需要的棧空間
  5. 多變元的函數調用

  綜上所述,多任務系統比前后台系統需要更多的代碼空間(ROM)和數據空間(RAM)。

  額外的代碼空間取決於內核的大小,而RAM 的用量取決於系統中的任務數。

 

12使用實時內核的優缺點

  實時內核也稱為實時操作系統或RTOS。它的使用使得實時應用程序的設計和擴展變得容易,

不需要大的改動就可以增加新的功能。通過將應用程序分割成若干獨立的任務,RTOS使得應用程序的設計過程大為減化。

  使用可剝奪性內核時,所有時間要求苛刻的事件都得到了盡可能快捷、有效的處理。通過有效的服務,

如信號量、郵箱、隊列、延時、超時等,RTOS使得資源得到更好的利用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM