首先我們的熟悉實時系統的概念,實時系統它分為軟實時和硬實時;軟實時系統它是指系統的目的是為了使各個任務盡快的執行,而不要求限定的某一個任務在多長時間內完成,也就是該系統超過規定時間對系統不會產生很大的影響,系統依然可以運行。而硬實時系統則不僅要求任務執行無誤,而且還要做到准時;也就是說在一到達規定的時間,任務必須完成,否則會給系統帶來災難性的后果。
我以前寫的程序很多是沒有嵌系統的,所以它們稱為前/后台系統或超循環系統。那么什么是前台,什么是后台呢?我們的程序中有個main函數,這個函數肯定是一個無限循環系統,在循環中調用相應的驅動函數完成相應的功能,這部分可以看成是后台行為;一般的系統都是有中斷發生的,那么中斷服務處理程序可以看成是前台行為;固有這個說法,后台可以成為任務級,前台成為中斷級。這種前/后台系統有一個很大的缺點,就是任務級的響應時間不是固定的,因為它是循環中的一部分,所以取決於循環運行的時間,所以前/后台系統很容易跑飛。
代碼的臨界段也稱臨界區,指處理時不可分割的代碼;所以進入臨界區之前必須關中斷,臨界區代碼執行完后,必須馬上開中斷。
任務,在UCOS-ii實時系統中,一個任務其實就是一個線程,該任務可以認為CPU完全屬於它自己。UCOS-ii中的任務擁有自己的堆棧和CPU寄存器,並且賦予一定的優先級,在UCOS-ii中,它可能處於睡眠、就緒、運行、等待、中斷服務狀態之一。1)睡眠狀態:它是一個什么樣的狀態呢,它其實是指一個任務在內存中就占用一部分ROM,它沒有被操作系統分配任務控制塊,它和其他狀態下的任務沒有任何直接聯系,也就是說不能被內核調度,就好比 我們去吃飯,正在路上;2)就緒狀態:它是指操作系統給它分配了任務控制塊,已經在就緒列表中登記中,它此時不能運行是因為它的優先級不是最高的,就好比我們去吃飯時在那排隊一樣;3)運行狀態:它 是指一個任務正在運行,應該好理解,就好比食堂工作人員在給我們打飯;4)等待狀態:就是一個任務由於一個的條件沒有滿足,比如說在等待一個信號量的到來,而被至於等待狀態,就像我們在打飯時,如果工作人員還沒有來,那你沒辦法,你就得等拉;5)中斷服務狀態:就是在某個時刻突然因為一個中斷到來,那么 這個任務就會馬上被中斷掉,從而處於中斷服務狀態,比如一個餓得受不了的人,如果搶你前面,本來該你打飯的,可是你看到他這個樣子,不忍心,那么你就被中斷了一會,中斷結束后,中斷掉的任務才會被繼續運行,同樣的你才能夠打飯;呵呵,這個比喻好像損了點。
在操作系統中,內核提供的基本服務就是任務切換,它實際上可以說是寄存器內容的切換。自然任務切換是需要時間的,CPU寄存器越多,負荷也就越大。
基於優先級的內核有兩種:不可剝奪型和可剝奪型。不可剝奪型內核它要求每個任務互相合作,也稱為合作型內核,每個任務不會被其它任務剝奪去,除非中斷的到來,即便如此,當中斷結束后,還是會回到原來被中斷的程序,而不會切換到具有高優先級的任務中去,這樣,高優先級的任務就不能夠及時得到執行,所以它的實時性是比較差的。但是它有一個很重要的特點,就是它可以使用不可重入函數,因為每個任務必須執行完,才能釋放CPU,這樣它對其它任務調用不可重入函數沒有影響;同理在大多數情況下它無須使用信號量來保護資源。
對於可剝奪型內核,只要高優先級任務一就緒,那它就會被執行,而當前正在執行的任務就會被掛起;正因為如此,對於系統的資源就不能像不可剝奪型那樣去使用,而是在使用前必須檢查是否可以使用,即互斥機制來保護臨界資源,如果不用的話,那么如果低優先級在使用臨界資源時,突然被高優先級把CPU給搶過去了,那么低優先級的臨界資源就可能會被告優先級任務給破壞掉,所以可剝奪型內核是不能調用不可重入函數的,必須對共享資源通過互斥來訪問。可剝奪型的優點是是系統的響應時間得到了優化,且是可知的。
實時系統中,中斷優先級反轉這一問題是出現得最多的,這問題的本質其實也不能理解,就是低優先級的任務占有高優先級的任務所需要的資源,而使高優先級不得不等低優先級把資源釋放才能執行,在UCOS中一樣也存在這問題。不過我們可以人為解決這問題,因為UCOS中可以動態的修改任務的優先級,那么我們可以通過優先級極限法,實際上就是把低優先級的任務的優先級提高為0級;使該任務不會被其他任務所中斷,直到該任務執行完共享資源的代碼后再回到原來的優先級。其實還有一種方法叫優先級繼承法,它的含義就是把低優先級任務的優先級提高至與要用到該低優先級任務所占用的資源;這要求內核能夠允許一個優先級可以對應於多個任務,同時支持時間片段輪度調度;顯然UCOS是不支持它的。更多的請見嵌入式實時系統中的優先級反轉問題。
上面提到了互斥,就簡要描述下互斥的條件;互斥我們一般在於共享資源打交道時經常用到,那么我們對這些共享資源要怎么才能做到合理利用而被破壞呢,那就要使當時內核的環境滿足互斥條件:關中斷、使用測試並置位指令(要求有相應的硬件)、禁止做任務切換、利用信號量。
信號量實際上是一種約束機制,熟悉操作系統應該都懂它,他有以下作用:1>控制共享資源的使用權『滿足互斥機制』2>標志某事件的發生3>使2個任務的行為同步。信號量可是0和1的兩個值也可以是0~n(n>2)的計數式的信號量;總之內核是時刻跟蹤信號量的『這句話可要好好理解』。一般說信號量只能實施3種操作:初始化,也可以稱是建立,此時要初始化信號量的初始值,記住是不能小於0的;等待信號量,這時等待信號量的任務一般處於掛起狀態,等待的任務如果發現信號量大於0,信號量的值減1,然后繼續執行,如果為0,該任務就掛起;然后就是發送信號量,發送時,信號量會增一,同時會進行任務調度。
死鎖也稱為抱死,指兩個任務無限期的等待對方的資源;防止死鎖的方法:1>先得到全部資源,再做下一步的工作2>用同樣的順序申請多個資源3>釋放資源是,使用相反的順序。還有就是定義超時來化解死鎖。
任務間的信息的傳遞有兩個途徑:全程變量和發消息給另一個任務。任務只能通過全程變量和中斷服務子程序通信。