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