天天看點

RTOS論文筆記(二)

李在林,韓宏克.嵌入式Linux實時性分析及改造.2010

Linux 的實時性測試——中斷延遲測試

在Linux中,核心或驅動程式顯式地關/開中斷,一般是通過調用_cli()/_sti()來進行操作的。在調用_cli()時,記錄系統的時間值,讀出當_sti()被調用的系統時間,它們之間的時間差就是關中斷時間。關中斷時間測試程式重寫了_cli()/_sti()宏,以允許記錄調用它們的檔案以及在何處調用,記錄這些資訊,以分析在Linux中哪些關中斷時間比較長。

注:作者利用關中斷時間代表中斷延遲時間可能不太合适,以下是我在網上搜到的

(Interrupt Latency) 中斷延遲,是指從硬體中斷發生到開始執行中斷處理程式第一條指令之間的這段時間。

也就是:計算機接收到中斷信号到作業系統作出響應,并完成換到轉入中斷服務程式的時間。

不嚴格地,也可以表述為:(外部)硬體(裝置)發生中斷,到系統執行中斷服務子程式(ISR)的第一條指令的時間。

另外,如果盡可能嚴格地考慮問題,那麼還要考慮下列情況:

1.中斷的詳細情況就是:外界硬體發生了中斷後,CPU到中斷處理器讀取中斷向量,并且查找中斷向量表,

找到對應的中斷服務子程式(ISR)的首位址,然後跳轉到對應的ISR去做相應處理。

此部分時間,我稱其為:識别中斷時間

2.在允許中斷嵌套的實時作業系統中,中斷也是基于優先級的,允許高優先級中斷搶斷正在處理的低優先級中斷,如ucOS/II,是以,如果目前正在處理更高優先級的中斷,即使此時有低優先級的中斷,

系統也不會立刻響應,而是等到高優先級的中斷處理完之後,才會響應。

而即使在不支援中斷嵌套,即中斷是沒有優先級的,中斷是不允許被中斷的,是以,如果目前系統正在處理一個中斷,而此時另一個中斷到來了,系統也是不會立即響應的,而隻是等處理完目前的中斷之後,才會處理後來的中斷。

此部分時間,我稱其為:等待中斷打開時間

3.在嵌入式系統中,如ucOS/II,(其他類似系統中也有此情況),

常用開關中斷來實作共享區的互斥通路。

是以,會出現這種情況:目前中斷來了,但由于之前某個程式通路共享區,

而關閉中斷了,導緻目前中斷得不到處理。而隻有等待其通路完成共享區之後,再開中斷。

(不過,一般來說,關中斷的時間都很短,否則也就不适合用開關中斷的方法來實作共享區互斥通路,

而應該用信号量或者其他手段實作。因為關中斷時間長短,是衡量一個實時系統性能好壞的一個重要名額)

此部分時間,我稱其為:關閉中斷時間

是以,總的中斷延遲時間就可以表示為:

中斷延遲 = 識别中斷時間 + [等待中斷打開時間] + [關閉中斷時間]

Linux實時改造——雙核心法

雙核心法

這種方法是在同一硬體平台上采用了2個互相配合、共同工作的系統核心,一個具有精确的實時多任務管理功能,另一個具有複雜的非實時通用功能。實時核心層負責硬體管理并提供實時任務管理,Linux核心是實時核心中優先級最低的,隻有當沒有可運作的實時任務時,Linux核心才被排程使用[]

RTLinux的實作方法

RTLinux将Linux核心當做一個任務,在一個小的實時作業系統下運作,隻有在沒有實時任務需要運作的空閑狀态時Linux(作為一個任務)才能投入運作。動态地看,Linux的運作不斷地被實時任務打斷。作為任務的Linux核心永遠不能關閉中斷,也就是不能避免自己被實時中斷任務先占。實作的關鍵技術是用軟體來模拟一個控制中斷的硬體,将實時中斷和非實時中斷差別對待。Linux為了取得某些操作的同步,經常要關中斷,這是造成其不可先占的根本原因。在RTLinux中,當Linux通知CPU關閉中斷時,實時核心截獲這個請求,并把它記錄下來,然後,傳回Linux繼續運作(注意:并未真的将中斷關閉,但CPU标志寄存器的中斷标志位IF仍為"1"),是以,Linux并沒有真正禁中斷。無論Linux處在什麼狀态,它都不會對實時系統的中斷響應增加任何延遲。當一個中斷信号到來時,實時核心截獲這個中斷信号,并識别其類型(是實時中斷還是Linux中斷);如果是實時的,則喚醒其處理函數;如果不是實時的,或者雖是實時的但其處理函數表明要同Linux共同處理這個中斷,則對之作“待處理”标記,并送入一個隊列排隊等候。

接下來,假如Linux已經開放中斷,實時核心就用軟中斷指令喚醒Linux的中斷處理函數,同時,使CPU重新開放中斷,以允許實時中斷進入。這樣Linux的所有中斷處理機制都能得到滿足;當它關閉中斷時,實時核心就不啟動任何Linux中斷處理函數,當然也就不會引起任何混亂。從以上機制可以看出,驅動Linux中斷處理函數的,實際上是實時核心,硬體發出的中斷信号完全由實時核心接管,實時核心是如何截獲Linux的中斷操作信号的呢?Linux是用"cli"和"sti"宏來操作關中斷和開中斷的。在标準的Linux中,這些宏隻是簡單地執行相應的X86指令。RTLinux對這些宏作了修改,當Linux用"cli"關閉中斷時,它并不是真正屏蔽所有中斷,而是轉去執行一些RTLinux代碼。

由此可知,硬體中斷信号完全由實時核心接管,而與Linux完全無關。無論Linux正在做什麼,不管它是在核心狀态還是使用者狀态下運作,中斷是開放的還是關閉的,也不管它是否正運作在回旋鎖狀态,實時系統總能夠對中斷做出及時響應。

下面,從CPU的中斷機制角度說明RTLinux模拟中斷分類硬體的方法。由前述可見,在RTLinux中,Linux核心永遠不能關閉中斷,實時核心為了不錯過任何一個中斷也不會輕易關中斷,是以,每一個中斷都會引發相應中斷處理子程式的執行。在RTLinux中,在保留标準Linux的IDT(中斷描述符表)的同時,實時核心另造了一個IDT,并使CPU的IDTR(中斷描述符表寄存器)指向這個IDT,當一個中斷信号到來時,CPU會自動用這個中斷信号的中斷類型碼(由中斷控制器8259A提供)由IDTR指向IDT中的相應位置,擷取中斷處理子程式的入口位址并轉入執行。

在中斷處理子程式中作如下處理:如果它是一個實時中斷,則轉去執行相應的實時處理函數;如果它是一個Linux中斷并且Linux處于開中斷狀态,則使IDTR重新指向Linux的IDT并發出一個軟中斷,激活Linux的中斷處理函數,如果Linux處于關中斷狀态,則使這個中斷進入等候隊列。

RTLinux的排程算法:

排程程式的工作,實際上就是采用某種排程算法從就緒隊列中挑選出一個任務,使之投入運作,RTLinux實時核心的排程程式采用純粹的優先級/時間驅動的排程政策,也就是說,在RTLinux中,永遠是優先級最高的就緒任務投入運作,直到它将自己挂起或者有更高優先級任務就緒。如果數個任務具有相同的優先級,且它們都是就緒隊列中優先級最高的任務,RTLinux排程器将按先入先出的政策進行排程。

繼續閱讀