基于OSEK/VDX標準的Trampoline操作系統(tǒng)研究
2.3 中斷管理
在OSEK操作系統(tǒng)中,ISR(Interrupt Service Routine)分成了兩類,即ISRl和ISR2。ISRl不使用操作系統(tǒng)服務,也不能調(diào)用其他的用戶定義函數(shù)。該類中斷服務例程執(zhí)行完了以后直接執(zhí)行中斷發(fā)生位置后的下一條指令,因此ISRl對任務管理沒有影響,運行時消耗的資源也比較少。ISR2是可以調(diào)用其他用戶定義的函數(shù)或使用部分OSEK服務的中斷例程,OSEK操作系統(tǒng)專門為它準備了一個堆棧Frame,用作調(diào)用其他函數(shù)的執(zhí)行環(huán)境。在系統(tǒng)生成階段,由用戶指定ISR2要調(diào)用的用戶定義函數(shù)或系統(tǒng)調(diào)用。ISR2能夠和任務之間共享資源,而這可能會造成死鎖:當ISR2啟動后試圖獲得一個已經(jīng)被一個任務占用的資源時,該任務也在等待中斷完成,因此ISR2和任務之間共享資源時需要使用同步機制。OSEK操作系統(tǒng)提供了用于資源訪問的GetResource和ReleaseResouree系統(tǒng)調(diào)用,任務和ISR2之間可以使用它們來共享資源,但是這種方法需要關閉訪問資源的中斷,可能使中斷長時間關閉,降低了操作系統(tǒng)的實時響應能力。另一種任務和ISR2之間共享資源的方法是OSEK標準所建議的方法,也就是使用OSEK PCP協(xié)議。使用這種方法時,當一個任務要獲取同ISR2共享的資源時,會把它的優(yōu)先級提升到比ISR2更高的優(yōu)先級,當任務執(zhí)行完成之后,再把優(yōu)先級恢復到原來的優(yōu)先級。這時ISR2更像任務,但是比普通任務有更高的優(yōu)先級。
Trampoline實現(xiàn)了一種延遲的ISRl和ISR2,從而使操作系統(tǒng)內(nèi)核更小。任務和ISR的描述符都繼承自一個tpl_exec_common結構,如圖2所示。任務描述符在tpl_exec_common結構里增加了事件管理的數(shù)據(jù)成員,也就是evl_set和evt_wait數(shù)據(jù)成員;而ISR描述符在tpl_exec_common結構里增加了一個指向附加數(shù)據(jù)的指針,也就是static_isr_desc數(shù)據(jù)成員,static_isr_desc指向的內(nèi)容可以放到ROM中,以減少RAM的使用。一個ISR對應著一個中斷向量。當一個中斷觸發(fā)時,Trampoline激活對應的ISR中斷服務例程并且返回。如果是ISRl,執(zhí)行完了以后將執(zhí)行觸發(fā)中斷位置后面的代碼;如果是ISR2,ISR2將運行預先定義的用戶定義函數(shù)或者系統(tǒng)服務,然后像普通任務一樣由調(diào)度器根據(jù)任務級的調(diào)度策略來調(diào)度執(zhí)行。
另外,Trampoline為ISR增加了一個抽象層。這樣,一方面幾個硬件中斷可以共享相同的中斷向量偏移,另一方面對應到一個中斷向量偏移的,有一個ISR的集合,而不是一個ISR。當一個硬件中斷觸發(fā)時,為了找到一個與該硬件中斷匹配的ISR,每組共享中斷偏移的ISR都必須提供一個函數(shù)來測試它對應的設備中斷標志是否為真。如果函數(shù)返回TRUE,該ISR將被激活。Trampoline設計了一種GIH(General Interrupt Handler)函數(shù)來完成這種測試工作。
而這樣做有兩個問題。第一,由于ISR2的后期執(zhí)行是在任務態(tài)運行,這時如果有一個硬件中斷觸發(fā),就會由GIH來確定一個ISR來執(zhí)行,從而打斷了原來的ISR2。即使后來觸發(fā)的ISR的優(yōu)先級比原來ISR2的優(yōu)先級低,這種情況也能發(fā)生。這就造成了一個低優(yōu)先級的硬件中斷搶占了高優(yōu)先級的中斷,而這種情況是不應該發(fā)生的,因此是一個很大的問題。第二,根據(jù)OSEK操作系統(tǒng)標準,當ISR運行時,不能進行重新調(diào)度。在Trampoline中,ISR2作為高優(yōu)先級的普通任務進行調(diào)度,當一個高優(yōu)先級ISR2到來時,任務調(diào)度器會重新調(diào)度一次,從而打斷了原來的ISR2的執(zhí)行。另外,在OSEK操作系統(tǒng)標準中,重新調(diào)度是在任務之間的重新調(diào)度;而在Trampoline中,只要有一個ISR2在運行,重新調(diào)度只能在有比普通任務更高優(yōu)先級的ISR2之間進行。當最后運行的ISR2結束時,CPU的重新調(diào)度才給了有最高優(yōu)先級的任務,因此,Trampoline的中斷管理部分的實現(xiàn)還有待改進。
3 在Linor/x86上開發(fā)TramooIine應用程序
Trampoline目前可以在四種目標平臺上使用:帶有Keil編譯器的Infineon C167、Darwin/PowerPC、FreesealeS12x和POSIX系列操作系統(tǒng)平臺。前三種平臺的硬件不常見,如果沒有就不能運行;而POSIX系列的Linux/x86平臺則很容易得到。下面以Linux/x86平臺為例,說明開發(fā)一個Trampoline應用程序的步驟和方法:
①生成應用程序的OIL配置文件。OSEK/VDX 0S是一個靜態(tài)操作系統(tǒng),系統(tǒng)對象需要在系統(tǒng)生成時定義。OIL是書寫這種定義的標準語言。它可以定義所有的應用程序使用的各種對象(任務、中斷、警報、計數(shù)器、資源、事件等)。OIL配置文件可以手工編寫,也可以使用圖形化開發(fā)配置工具來生成。目前Trampoline沒有圖形化配置工具,只能手工編寫OIL配置文件。
②使用OIL文件解析器GOIL將應用程序的OIL文件轉化為一個.c文件和.h文件,其主要功能是進行與應用程序相關的各種系統(tǒng)對象參數(shù)的定義、初始化等工作。
③使用GCC工具鏈將②生成的文件和Trampoline操作系統(tǒng)內(nèi)核文件及l(fā)ibpcl庫文件、VIPER虛擬處理器文件等進行編譯和鏈接,生成一個Linux平臺的可執(zhí)行文件,也就是最終的應用程序可執(zhí)行文件。
評論