楊媛媛 王曉華 李敏 馮思桐
摘要:在嵌入式系統(tǒng)和各類操作系統(tǒng)中,中斷是系統(tǒng)確保實(shí)時響應(yīng)各類異步事件的重要機(jī)制。中斷驅(qū)動系統(tǒng)的合理設(shè)計(jì)能夠保證在完整實(shí)現(xiàn)系統(tǒng)功能的同時,保證系統(tǒng)設(shè)計(jì)的正確性和時間約束。本文研究了典型Xilinx FPGA芯片中的中斷處理,提出了一種中斷隊(duì)列處理方法,并在一款基于Xilinx FPGA芯片開發(fā)的通信子卡上對該方法進(jìn)行了驗(yàn)證。
關(guān)鍵詞:中斷處理;FPGA ;SDK
中斷是指處理器受到內(nèi)部或外部事件觸發(fā),暫停當(dāng)前程序的執(zhí)行,轉(zhuǎn)而執(zhí)行處理緊急事件的處理程序,并在該事件處理完后能自動恢復(fù)執(zhí)行原先程序的過程。我們稱引起緊急事務(wù)的事件為中斷事件,處理緊急事務(wù)的程序?yàn)橹袛喾?wù)例程。在嵌入式系統(tǒng)和各類操作系統(tǒng)中,中斷是系統(tǒng)確保實(shí)時響應(yīng)各類異步事件的重要機(jī)制。中斷驅(qū)動系統(tǒng)的合理設(shè)計(jì)能夠保證在完整實(shí)現(xiàn)系統(tǒng)功能的同時,保證系統(tǒng)設(shè)計(jì)的正確性和時間約束。
本文首先介紹了Xillinx FPGA芯片中典型利用中斷控制器核進(jìn)行中斷處理的原理,其次典型處理方法存在的弊端,針對性地設(shè)計(jì)了一種隊(duì)列中斷處理方法,并在一款基于Xilinx FPGA芯片開發(fā)的通信子卡上對該方法進(jìn)行了驗(yàn)證。
1 典型中斷處理方法
在進(jìn)行軟件開發(fā)時,設(shè)計(jì)人員可以通過XILLINX公司提供的中斷控制器核來進(jìn)行管理中斷。中斷控制器核可以同時接收并判別多個外部中斷,根據(jù)優(yōu)先級的高低順序向處理器輸送中斷請求,當(dāng)處理器響應(yīng)中斷并進(jìn)入中斷處理例程后,該控制器仍負(fù)責(zé)對外部中斷的管理[5]。開發(fā)人員為每一種類型的中斷分配中斷狀態(tài)寄存器的某一個比特位,當(dāng)中斷到來時,將對應(yīng)比特位置1,同時調(diào)用對應(yīng)的中斷處理例程進(jìn)行中斷處理,軟件人員可通過查看中斷狀態(tài)寄存器的值來獲知當(dāng)前的中斷情況,處理完中斷后,將對應(yīng)的中斷狀態(tài)位清零,即完成本次中斷處理。中斷具有優(yōu)先級,低優(yōu)先級的中斷處理例程能夠被較高優(yōu)先級的中斷中止并掛起,較高優(yōu)先級的中斷處理例程能夠被更高級別的中斷中止并掛起,形成中斷多重嵌套。當(dāng)最高級別的中斷處理完成后,依次繼續(xù)處理較高優(yōu)先級的中斷和最低優(yōu)先級的中斷。
典型的中斷處理方法是在中斷處理例程中完成所有中斷處理操作和中斷任務(wù)執(zhí)行,比如消息的發(fā)送,接收消息的處理,狀態(tài)的記錄和變更等等,這就使得中斷的處理時間無法預(yù)計(jì)和控制。中斷嵌套的形成加劇了系統(tǒng)時間約束的困難,長時間的中斷掛起和嵌套會產(chǎn)生如中斷處理超時、資源搶占、數(shù)據(jù)沖突等多種問題[1,2,7]: (a)中斷處理時間過長問題:多重中斷嵌套會導(dǎo)致低級別中斷事件無法及時被響應(yīng)和處理完成,由于每個中斷僅對應(yīng)一個比特位,當(dāng)同一個中斷連續(xù)到來且得不到及時處理時,會容易產(chǎn)生中斷丟失和中斷合并;(b)通信異常問題:例如在通信過程中,設(shè)備A每隔T時間向設(shè)備B發(fā)送一次信息包,如果在B接收信息的過程中被其他中斷掛起,就可能導(dǎo)致B不能及時發(fā)送應(yīng)答信息到設(shè)備A,引發(fā)本次通信失敗,造成數(shù)據(jù)丟失[7];(c)數(shù)據(jù)競爭問題:兩個不同優(yōu)先級中斷的處理例程在訪問相同公共資源(如共享變量、寄存器、內(nèi)存單元等)時,可能導(dǎo)致讀-寫或者寫-寫訪問沖突[7];(d)由于中斷事件的發(fā)生順序和發(fā)生時間是不確定的,這將導(dǎo)致不同的處理順序,中斷系統(tǒng)中包含的某些設(shè)計(jì)錯誤只有在特定的處理順序之下才會顯現(xiàn)出來,故障分析和排查難度將大大增加。中斷觸發(fā)的不可預(yù)測性使得系統(tǒng)運(yùn)行時的時序較復(fù)雜。
2 中斷隊(duì)列處理方法
造成中斷嵌套諸多問題的原因在于中斷任務(wù)執(zhí)行的時間不確定性。針對上述問題,本文設(shè)計(jì)了一種中斷隊(duì)列處理方法。該方法在主程序中設(shè)計(jì)了一個中斷處理循環(huán)隊(duì)列,隊(duì)列元素即為按觸發(fā)順序存放的中斷任務(wù)及其關(guān)鍵參數(shù),所有的中斷任務(wù)按先進(jìn)先處理的原則進(jìn)行順序執(zhí)行,而被中斷觸發(fā)所調(diào)用的中斷處理例程僅用于將中斷任務(wù)相關(guān)的關(guān)鍵參數(shù)入隊(duì)列后即可立即退出,返回主程序。
兩種方法相比,傳統(tǒng)中斷處理的流程為中斷觸發(fā)-中斷接收-中斷任務(wù)執(zhí)行-中斷清除-中斷結(jié)束,而中斷隊(duì)列處理的流程為中斷觸發(fā)-中斷接收-中斷關(guān)鍵參數(shù)入隊(duì)列-中斷清除-中斷結(jié)束-按隊(duì)列在主程序中執(zhí)行中斷任務(wù),二者最主要的區(qū)別在于典型中斷處理的中斷任務(wù)在中斷例程中執(zhí)行,而中斷隊(duì)列處理方法的中斷任務(wù)在主程序中執(zhí)行。
中斷隊(duì)列處理方法沒有違背中斷嵌套模式中高優(yōu)先級搶占低優(yōu)先級中斷的原則,當(dāng)兩種中斷同時觸發(fā),中斷控制器會優(yōu)先調(diào)用高優(yōu)先級的中斷處理例程,將高優(yōu)先級中斷任務(wù)放入處理隊(duì)列,主程序則會優(yōu)先處理高優(yōu)先級中斷任務(wù)。由于中斷處理例程中僅是將關(guān)鍵參數(shù)入列,處理器在中斷處理例程中消耗的時間很短,當(dāng)一個中斷到來后能夠迅速退出,增強(qiáng)了中斷的響應(yīng)速度,減少了中斷丟失或中斷合并的概率,最大限度地保護(hù)了中斷資源,壓縮了中斷處理時間,解決了中斷處理時間過長和通信異常的問題;由在中斷產(chǎn)生的空閑時間內(nèi),主程序按先進(jìn)先處理的原則處理隊(duì)列中的中斷任務(wù),只有將當(dāng)前任務(wù)處理完畢之后才會接著處理下一個隊(duì)列任務(wù),這樣中斷任務(wù)不會同時執(zhí)行,解決了中斷任務(wù)嵌套導(dǎo)致的數(shù)據(jù)競爭問題。
3 驗(yàn)證與對比分析
為了驗(yàn)證上述方法的合理性,我們利用一款在Xillinx FPGA上開發(fā)的,基于MicroBlaze軟核處理器的通信子卡來進(jìn)行對比驗(yàn)證。由于軟核無操作系統(tǒng),應(yīng)用程序直接訪問板級資源和處理器特定功能的軟件模塊的最底層,因此選擇在SDK的Standalone模式下進(jìn)行應(yīng)用程序開發(fā)[4],利用SDK中開發(fā)的應(yīng)用軟件與邏輯聯(lián)編共同實(shí)現(xiàn)子卡的通信功能。由于軟核中無操作系統(tǒng),無法利用進(jìn)程實(shí)現(xiàn)任務(wù)功能,只能在主循環(huán)中進(jìn)行順序執(zhí)行,只有中斷能夠打斷主循環(huán),處理完中斷之后,再回到主循環(huán)執(zhí)行任務(wù)。這種工作機(jī)制意味著如果軟核想要實(shí)現(xiàn)多種功能,就必須使用中斷觸發(fā),且有關(guān)中斷的處理必須在中斷處理例程中全部完成。通過制造中斷并觀察程序的執(zhí)行順序和結(jié)果,就可以明確兩種方法的區(qū)別所在。
我們分別采用普通中斷處理方法和隊(duì)列處理中斷方法進(jìn)行了試驗(yàn)。使用一組實(shí)例來描述中斷隊(duì)列處理。從0遞增,優(yōu)先級逐次降低,即中斷優(yōu)先級為0的優(yōu)先級最高,依次類推。外圍設(shè)備產(chǎn)生優(yōu)先級為1的中斷,優(yōu)先級3和4的中斷同時產(chǎn)生,緊接著發(fā)生優(yōu)先級為4的中斷、優(yōu)先級為5的中斷和優(yōu)先級2的中斷。試驗(yàn)結(jié)果如下圖所示,方框的大小代表處理時長。
對比圖1和圖2,當(dāng)優(yōu)先級3和優(yōu)先級4同時發(fā)生時,2種策略都會首先觸發(fā)優(yōu)先級高的中斷。圖2中,由于需要在中斷處理例程中處理任務(wù),導(dǎo)致處理時間過長,緊隨其后的優(yōu)先級4中斷無法被及時處理,直到下一個優(yōu)先級4的中斷到來,根據(jù)中斷控制器的處理原則,中斷狀態(tài)寄存器對應(yīng)位保持為1,兩個優(yōu)先級4的中斷被合并,當(dāng)處理完第一個后,中斷狀態(tài)寄存器對應(yīng)位被清0,丟失一個優(yōu)先級4中斷。而圖1在將優(yōu)先級3的中斷參數(shù)記錄進(jìn)隊(duì)列后,立即退出中斷處理例程,使得中斷控制器能夠立刻調(diào)用優(yōu)先級4的中斷處理例程,中斷處理例程記錄當(dāng)前信息并入隊(duì)列后退出處理例程,當(dāng)下一個優(yōu)先級4的中斷到來時,繼續(xù)入隊(duì)列,所有中斷均被保留。而對于通信子卡而言,若優(yōu)先級4為消息發(fā)送中斷,則會導(dǎo)致通信子卡少發(fā)送一條消息,導(dǎo)致數(shù)據(jù)丟失。使用隊(duì)列處理中斷方法能夠保證所有優(yōu)先級的中斷例程處理時間相當(dāng),因此,能夠保證中斷被及時接收并根據(jù)中斷順序進(jìn)行處理。
對比圖1和圖2,優(yōu)先級5的中斷先于優(yōu)先級2的中斷到來,圖2中,中斷控制器首先進(jìn)入優(yōu)先級5的中斷處理例程,但由于該程序執(zhí)行時間較長,執(zhí)行過程被較高的優(yōu)先級2所打斷,優(yōu)先級5的中斷處理例程被迫掛起,等待優(yōu)先級2的中斷處理例程執(zhí)行完畢后才能再次執(zhí)行。若優(yōu)先級5和優(yōu)先級2需要訪問同一塊內(nèi)存或全局變量,則在優(yōu)先級2處理完畢后,再次執(zhí)行的優(yōu)先級5的中斷處理例程的環(huán)境參數(shù)和被中止前相比已發(fā)生了變化,此時再接著處理優(yōu)先級5的處理程序,會存在數(shù)據(jù)錯誤的隱患。對于通信子卡而言,若共享的內(nèi)存是接收到的數(shù)據(jù),則優(yōu)先級2的處理有可能將接收數(shù)據(jù)被改變從而導(dǎo)致優(yōu)先級5拿到的數(shù)據(jù)是錯誤的,從而導(dǎo)致通信失敗。而在圖1中,在進(jìn)入優(yōu)先級5的中斷處理例程時,僅將中斷參數(shù)記錄進(jìn)中斷處理隊(duì)列后即退出,接著優(yōu)先級2中斷被觸發(fā)并入隊(duì)列。在中斷間隙,主程序中依據(jù)先到先處理的中斷處理隊(duì)列,將優(yōu)先級5的任務(wù)執(zhí)行完畢后再接著執(zhí)行優(yōu)先級2的任務(wù),涉及的全局變量或內(nèi)存不會被同時使用,保證程序執(zhí)行結(jié)果的正確性和可靠性。使用隊(duì)列處理中斷方法能夠保證所有優(yōu)先級的中斷處理順序與實(shí)際到來的一致,保證中斷任務(wù)的時序正確和結(jié)果的可靠性。
4 總結(jié)
本文提出了一種中斷隊(duì)列處理方法。該方法優(yōu)化了中斷處理的方法和時機(jī),在保證中斷處理的時序的同時,最大限度地保護(hù)中斷資源,解決了中斷嵌套導(dǎo)致的資源競爭、數(shù)據(jù)沖突和中斷超時等問題。
參考文獻(xiàn):
[1] Silberschatz A, Galvin PB, Gagne G. Operating System Concepts. 8th ed., Boston: Addison-Wesley Longman Publishing Co., Inc.,2008.
[2] Walker W,Cragon H G.Interrupt processing in concurrent processors[J].Computer,1995,28(6):36-46.
[3] PG099-AXI Interrupt Controller (INTC) v4.1-LogiCORE IP Product Guide-Vivado Design Suite-April 6, 2016
[4] UG647-Standalone (v.5.3)-November 18, 2015
[5] 楊政,郝順義.基于CPLD的中斷控制器IP設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2002,25(6):19-20,23.
[6] 吳志勇,劉繼平,郭元興.基于FPGA的中斷控制器設(shè)計(jì)[J].通信技術(shù),2018,51(11):2765-2769.
[7] 周筱羽,顧斌,趙建華,等.中斷驅(qū)動系統(tǒng)模型檢驗(yàn)?[J].軟件學(xué)報,2015,26(9):2212-2230.
【通聯(lián)編輯:唐一東】