嵌入式實時操作系統ucosii——實時系統概念

1、前/後臺系統
後臺行爲:無限循環的應用程序,也可以叫做任務級
前臺行爲:中斷服務程序處理異步事件,也可以叫做中斷級


2、代碼的臨界段
臨界區:指處理時不可分割的代碼(爲了確保臨界段代碼的執行不被中斷,在進入臨界段之前必須關中斷,而臨界段代碼執行完後,須馬上打開中斷)
3、資源
任何爲任務所佔用的實體都可稱爲資源。資源可以使輸入、輸出設備,也可以是一個變量、一個結構或一個數組
4、共享資源
可以被一個以上的任務使用的資源叫做共享資源。爲了防止數據被破壞,每個任務在與共享資源打交道時,必須獨佔該資源。
5、多任務
多任務運行的實現實際上靠CPU在需多任務之間轉換和調度。CPU只有一個,輪番服務於一系列任務中的某一個。

6、任務
一個任務,即一個線程,是一個簡單的程序,該程序可以認爲CPU完全只屬於該程序自己,每個任務都被賦予一定的優先級,有自己的一套CPU寄存器和棧空間
每個任務都是無線循環的,都可能處於以下5種狀態之一
休眠態:任務駐留在內存中,但並不被多任務內核所調度
就緒態:任務已經準備好,可以運行,但因爲優先級比正在運行任務的優先級低,暫時還不能運行
運行態:該任務掌握了CPU使用權,正在運行
掛起態(等待某一事件發生):任務正在等待,等待某一事件的發生(如中斷,等待某共享資源的使用權,等待定時脈衝,等待超時信號,等等)
被中斷態:發生中斷,原來正在運行的任務暫時不能運行

7、任務切換
CPU寄存器內容切換。當多任務內核決定運行另外的任務時,它保存正在運行任務的當前狀態,這些內容保存在任務的當前狀況保護區(即任務自己的棧區之中),入棧工作完成後,將下一個要運行的任務重新裝入CPU寄存器,開始任務的運行。
任務切換所欲要的時間取決於CPU有多少寄存器要入棧。
8、內核
內核(kernel)負責管理各個任務,爲每個任務分配CPU時間,並且負責任務間的通信。實時內核允許將應用分成若干個任務,由實時內核來管理它們。
注:單片機一般不能運行實時內核,因爲單片機的RAM很有限,通過提供必不可少的系統服務,諸如信號量管理、郵箱、信息隊列及時間延時等,實時內核使得CPU的利用更爲有效,用實時內核做過系統設計以後,將絕不會再想回到以前的前後臺系統
9、調度
內核的主要職責之一:決定該輪到哪個任務運行了。多數實時內核是基於優先級調度法(CPU總是讓處於就緒態、優先級最高的任務先運行)
基於優先級的內核有2種類型:不可剝奪型可剝奪型
10、不可剝奪型內核
不可剝奪型內核要求每個任務主動放棄CPU的使用權。
中斷服務可使一個高優先級的任務由掛起態轉爲就緒態,但中斷服務以後,CPU的使用權還是回到原來被中斷了的那個任務。
優點:響應中斷快,允許使用不可重入函數,完全不用擔心其他任務正在使用不可重入函數(不得有放棄CPU使用權的企圖),造成數據的破壞

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

12、可重入函數
可重入函數:可以被一個以上的任務調度,不用擔心數據被破壞
不可重入函數:相反
13、時間片輪番調度法
當2個及以上任務有相同優先級時,內核運行1個任務運行實現確定的一段時間(叫做時間額度),然後切換給另一個任務(這過程叫做時間片輪番調度
條件:(1)當前任務已空閒;
(2)當前任務在時間片還沒結束時已經完成;
(3)時間片結束;
14、任務優先級
每個任務都有其優先級。任務越重要,賦予的優先級應越高。就大多數內核而言,每個任務的優先級是由用戶決定的。
15、靜態優先級
應用程序執行過程中諸任務優先級不變
16、動態優先級
應用程序執行過程中,任務的優先級是可變的。注:實時內核應當避免出現優先級反轉問題
17、優先級反轉
任務1優先級高於任務3,但任務3得到信號量,導致任務1無法得到信號量,所以任務1被掛起,任務2優先級高於任務3,所以得等任務2運行完,運行任務3,等任務3釋放信號量,最後才能運行任務1.

解決辦法:將當任務3的優先級提升到跟任務1優先級相同,以避免出現優先級反轉現象

18、任務優先級分配
單調執行率調度法(RMS),用於分配任務優先級
假設:
(1)所有任務都是週期性的;
(2)任務間不需要同步,沒有共享資源,沒有任務間數據交換等問題;
(3)CPU必須總是執行優先級最高且處於就緒態的任務(使用可剝奪型調度法)
19、互斥條件
實現任務間通信最簡單的辦法是使用共享數據結構,雖然共享數據區法簡化了任務間的信息交換,但是必須保證每個任務在處理共享數據時的排他性,以避免競爭和數據的破壞,與共享資源打交道時,使之滿足互斥條件一般方法有:
(1)關中斷和開中斷
(2)測試並置位操作
(3)禁止,然後允許任務切換
(4)信號量
a.控制共享資源的使用權
b.標誌某事件的發生
c.使2個任務的行爲同步
20、死鎖
抱死:指2個任務無限期地等待對方控制着的資源
最簡單的解決辦法,讓每個任務都:
(1)先得到全部需要的資源,再做下一步的工作;
(2)用同樣的順序申請多個資源
(3)釋放資源時,用相反的順序
21、同步

利用信號量使某任務與中斷服務同步(或者與另一個任務同步),某一事件的發生(這裏的信號量不再是一把用來保證互斥條件的鑰匙),用來實現同步機制的信號量初始化爲0,信號量用與這種類型的同步,叫做單向同步

2個任務可以用2個信號量同步他們的行爲,這叫做雙向同步
22、事件標誌
當某任務要與多個事件同步時,須用事件標註(event flag)

若任務需要與任何事件之一發生同步,可稱爲獨立型同步

若任務也可以與若干事件都發生了同步,稱之爲關聯型同步
23、任務間通信
有時很需要任務間或中斷服務與任務間的通信,這種信息傳遞稱爲任務間的通信
途徑有2個:通過全程變量,或發消息給另一個任務。
24、消息郵箱(先進先出)
通過內核服務可以給任務發送消息。消息郵箱也稱交換消息。把一則消息(一個指針)放到郵箱裏去,同樣一個或多個通過內核服務,可以接收這則消息。

內核一般提供以下郵箱服務:
(1)郵箱內消息內容的初始化,郵箱裏最初可以有,也可以沒有消息
(2)將消息放入郵箱(POST)
(3)等待消息進入郵箱(PEND)
(4)從郵箱中得到消息。如果郵箱裏沒有消息,則任務並不被掛起;如果油箱內有消息,就接收這則消息
注:消息郵箱也可以當作只取2個值的信號量來用。郵箱裏有消息,表示資源可以使用,而空郵箱表示資源已被其他任務佔用。
25、消息隊列(先進先出,ucosii也運行後進先出)
消息隊列用於給任務發消息。消息隊列實際上是郵箱陳列。通過內核提供的服務,任務或中斷服務子程序可以將一則消息放入消息隊列。同樣,一個或多個任務可以通過內核服務從消息隊列中得到消息。

內核提供的消息隊列服務如下:
(1)消息隊列初始化,隊列初始化時總是清爲空
(2)放一則消息到隊列中去(POST)
(3)等待一則消息的到來(PEND)
(4)如果隊列中有消息,則任務可以得到消息,但如果此時隊列爲空,內核並不將該任務掛起。如果有消息,則消息從隊列中取走。
26、中斷
中斷是一種硬件機制,用於通知CPU“有異步事件發生”,中斷一旦被識別,CPU保存部分或全部現場,稱爲中斷服務子程序
中斷服務子程序做事件處理,處理完成後,程序回到:
(1)在前/後臺系統中,系統回到後臺程序;
(2)對不可剝奪型內核而言,程序回到被中斷了的任務
(3)對於可剝奪型內核而言,讓進入就緒態的優先級最高的任務開始運行
優點:不比讓微處理器連續不斷地查詢是否有事件發生

27、中斷延遲
實時內核最重要的指標可能就是關中斷的時間的長短。所有實時系統在進入臨界區代碼段之前,都要關中斷;執行完臨界代碼之後,再開中斷。
中斷延遲 = 關中斷的最長時間 + 開始執行中斷服務子程序第1條指令的時間
28、中斷響應
中斷響應的定義:從中斷髮生到開始執行用戶的中斷服務子程序代碼來處理這個中斷的時間
對於前後臺系統:中斷響應 = 中斷延遲 + 保存CPU內部寄存器的時間
對於不可剝奪型內核:中斷響應 = 中斷延遲 + 保存CPU內部寄存器的時間
對於可剝奪型內核;中斷響應 = 中斷延遲 + 保存CPU內部寄存器的時間 + 內核進入中斷服務函數的執行時間
29、中斷恢復時間
(1)可剝奪型內核,中斷恢復時間定義爲:微處理器返回到被中斷了的程序代碼所需要的時間,或返回到更高級優先級任務的時間。
中斷恢復時間 = 判斷是否有優先級更高的任務進入了就緒態的時間 + 恢復優先級更高的任務的CPU內部寄存器的時間 + 執行中斷返回指令的時間
(2)前後臺系統中,中斷恢復時間只包括恢復CPU內部寄存器值的時間和執行中斷返回指令的時間
中斷恢復時間 = 恢復CPU內部寄存器值的時間 + 執行中斷返回指令的時間
(3)不可剝奪型內核,中斷恢復時間與前後臺系統一樣
中斷恢復時間 = 恢復CPU內部寄存器值的時間 + 執行中斷返回指令的時間
30、中斷延遲、響應及恢復





31、中斷處理時間
中斷服務子程序代碼是應用程序中最重要的代碼,則中斷服務需要多長時間,就應該給它多長時間,然而大多書情況下,中斷服務子程序應識別中斷來源,從請求中斷的設備取得數據或狀態,並通知做該事件的任務。
此時該考慮,通知的時間是否大於處理的時間。如果事件處理需要花的時間短於任務通知時間,就應該考慮在中斷服務子程序中做事件處理,並在中斷服務子程序中開中斷,以允許優先級更高的中斷打入並優先得到服務。
32、非屏蔽中斷(NMI)
(1)絕大多數微處理器具有非屏蔽中斷功能。通常非屏蔽中斷留做緊急處理用,非屏蔽中斷可用於時間要求最苛刻的中斷服務。
如何確定中斷延遲時間、中斷響應時間及中斷恢復時間
中斷延遲時間 = 指令執行時間中最長的時間 + 開始做非屏蔽中斷服務的時間
中斷響應時間 = 中斷延遲時間 + 保存CPU寄存器的時間
中斷恢復時間 = 恢復CPU寄存器的時間 + 執行中斷返回指令的時間
(2)非屏蔽中斷可以用增加外部電路的方法禁止

(3)非屏蔽中斷產生普通可屏蔽中斷

33、時鐘節拍
34、對存儲器的需求
前/後臺系統:存儲器容量的需求僅僅取決於應用程序代碼
使用多任務內核:總代碼量 = 應用程序代碼 + 內核代碼
所有內核都需要額外的棧空間,以保證內部變量、數據結構及隊列等的需求
(1)如果內核不支持單獨的中斷用棧,則總的RAM需求表達式
RAM總需求 = 應用程序的RAM需求 + (任務棧需求 + 最多中斷嵌套棧需求)*任務數
(2)如果內核支持中斷用棧分離,總RAM需求表達式
RAM總需求 = 應用程序的RAM需求 + 內核數據區的RAM需求 + 各任務棧需求之總和 + 最多中斷嵌套棧需求
注:棧空間的分配和使用需要非常謹慎
a.定義函數和中斷服務子程序中的局部變量,特別是定義大型數組和數據結構;
b.函數(子程序)的嵌套;
c.中斷嵌套;
d.庫函數需要的棧空間;
e.多變元的函數調用;
額外的代碼空間取決於內核的大小,而RAM的用量取決於系統中的任務數
35、使用實時內核的優、缺點
實時內核(RTOS或者實時操作系統)使實時應用程序的設計和擴在容易
36、實時系統小結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章