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