楊媛媛 王曉華 李敏 馮思桐

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