中斷處理模式: 外部中斷處理和內(nèi)部中斷處理的差異性
在現(xiàn)今SOC設(shè)計中,當周邊裝置(Peripheral IP)想要和中央處理器(CPU)溝通時,最常使用的機制是透過中斷(Interrupt)。周邊裝置可觸發(fā)中斷給中央處理器,當中央處理器接收到中斷后,則可判斷是由那個周邊裝置觸發(fā)些中斷,接著處理相對應的中斷處理程序(ISR,Interrupt Service Routine),藉此達到彼此溝通的目的。
而AndesCore™在中斷處理方面,共支持兩種模式:內(nèi)部中斷處理器(IVIC Mode,Internal Vector Interrupt Controller)和外部中斷處理器(EVIC Mode,External Vector Interrupt Controller)。其中最大的差異性,即是中斷控制器所存在的位置。在內(nèi)部中斷處理模式下,AndesCore™本身即設(shè)置了一個中斷控制器存在于CPU內(nèi)部,經(jīng)由此中斷控制器來處理相關(guān)中斷的工作。而在外部中斷處理模式下,用戶必須在CPU外部實做一個中斷控制器來處理相關(guān)中斷工作。
除了上述的差異性之外,在硬件方面的整合和軟件方面的應用,也存在些許差異性。本文之目的除了介紹這些差異性外,也提供一個簡單的設(shè)計平臺供使用者參考。期望能對使用者有所幫助,也希望讀者不吝指教提供您寶貴的意見。
1. 中斷處理模式介紹
AndesCore™共支持兩種中斷處理模式:內(nèi)部中斷處理器(IVIC Mode,Internal Vector Interrupt Controller)和外部中斷處理器(EVIC Mode,External Vector Interrupt Controller)。以下的介紹將架構(gòu)于AndesCore™ N968A-S這顆中央處理器。帶領(lǐng)使用者循序漸進地,了解這兩種中斷處理模式的差異。
1.1 Definition
AndesCore™ N968A-S支持兩種中斷處理模式,首先,我們先介紹關(guān)于這兩種模式的定義。
1.1.1 IVIC Mode
AndesCore™ N968A-S內(nèi)部設(shè)計了一個中斷控制器,所支持的中斷來源數(shù)目可透過配置來決定。目前最大可支持16個中斷來源,但可擴充至32個。請參考圖表 1。若使用這存在于CPU內(nèi)部的中斷控制器來處理相關(guān)中斷工作時,則為IVIC模式。假若SOC的中斷來源大于32個時,使用者還是可以使用IVIC模式,但是需要將多個中斷來源合為一個中斷訊號線(ex: OR function),且中斷處理程序(ISR)在該中斷訊號線觸發(fā)時,需要去判斷是由那個中斷來源所觸發(fā)。在N968A-S的IVIC mode之下,每個中斷來源可以選定值為0~3的優(yōu)先權(quán) (priority). 優(yōu)先權(quán)高的中斷來源可以打斷優(yōu)先權(quán)低的中斷來源。
1.1.2 EVIC Mode
假若IVIC模式不符合用戶所設(shè)計的系統(tǒng),用戶就需要選用EVIC模式。在此模式下,用戶需要額外設(shè)計一個中斷控制器,用來處理周邊裝置和中央處理器之間相關(guān)中斷的工作,作為兩者間溝通的橋梁。
圖表 1. AndesCore™ N968A-S 所支持中斷來源數(shù)目
1.1.1 Interruption Vector Entry Points
為了加速中斷處理的時間,AndesCore™ N968A-S內(nèi)部實做了一個Interruption Vector Table。將不同的中斷事件分別對應到不同的Vector Entry,當中斷發(fā)生時,CPU即可判斷中斷是由那個周邊裝置所觸發(fā),并跳到該中斷所對應的Vector Entry,進而執(zhí)行相關(guān)的中斷處理程序(ISR)。
在前面章節(jié)有介紹AndesCore™ N968A-S支持兩種不同的中斷處理模式。因此,在不同的中斷處理模式下,也對應了不同的Interruption Vector Table。
1.1.1.1 Interruption Vector Table of IVIC Mode
在IVIC模式下,所支持的中斷來源可由用戶來配置,支持的數(shù)目由2個到32個。Interruption Vector Table相關(guān)信息如下:
l 41 entry points (9 exceptions + 32 interrupts)
l Address = IVB.IVBASE + (entry number) * IVB.ESZ
(VEP: Vector Entry Point)
圖表2. Interruption Vector Table of IVIC Mode
1.1.1.1 Interruption Vector Table of EVIC Mode
在EVIC模式下,所支持的中斷來源數(shù)目可達到64個中斷。Interruption Vector Table相關(guān)信息如下:
l 73 entry points (9 exceptions + 64 interrupts)
l Address = IVB.IVBASE + (entry number) * IVB.ESZ
圖表3. Interruption Vector Table of EVIC Mode
1.2 Signal Descriptions
AndesCore™ N968A-S 提供相關(guān)中斷訊號線,使得CPU可與周邊裝置或是外部中斷控制器溝通。在EVIC模式下,除了中斷來源訊號線之外,還包含了和外部中斷控制器相互溝通的訊號線,詳細訊號線敘述如下:
其中,evic_ireqval和evic_ireqack這兩個訊號線用來和外部中斷控制器溝通。在IVIC模式下,周邊裝置的中斷訊號可和int_req[N:0]直接整合。當周邊裝置觸發(fā)中斷時,相對應的int_req訊號會拉起,告知CPU該周邊裝置觸發(fā)了中斷,CPU即會跳到所對應的Vector Entry來執(zhí)行相關(guān)的中斷處理程序。
而在EVIC模式下,外部中斷控制器會負責處理周邊裝置的中斷訊號。當周邊裝置觸發(fā)中斷時,外部中斷處理器會負責和周邊裝置溝通,并將相對應的中斷訊號(int_req)和中斷需求訊號(evic_ireqval)發(fā)給CPU,當CPU接收到中斷時,會將中斷接收訊號(evic_ireqack)拉起,告知外部中斷處理器收到中斷,并去處理相關(guān)中斷處理程序。
相關(guān)處理程序可參考圖表 5。在ARC a時,當ireqack訊號為low時,CPU可等待周邊裝置觸發(fā)中斷。當周邊裝置觸發(fā)中斷,外部中斷控制器將相對應中斷訊號int_req和ireqval拉起,告知CPU有中斷發(fā)生。在ARC b時,當CPU收到中斷,則將ireqack訊號拉起,告知外部中斷控制器已收到中斷。在ARC c時,外部中斷控制器將ireqval訊號拉下,并等待CPU將ireqack訊號拉下(在ARC d時),表示CPU可接收新的中斷觸發(fā)。
1.3 System Register Setting
關(guān)于上述兩種中斷模式的選擇,用戶可透過設(shè)定AndesCore™ N968A-S內(nèi)部的一個system register來達到目的。
該system register為Interruption Vector Base Register(ir3)。其中的第13個bit決定不同的中斷模式。其格式如下:
2. Reference Design Architecture
在介紹完中斷處理模式相關(guān)定義之后,本章節(jié)提供在實際整合與應用上的范例,讓用戶可更了解在不同中斷處理模式下的差異。
2.1 主要架構(gòu)
本次所實作的Reference Design主要是架構(gòu)在Andes mini-platform上,搭配AndesCore™ N968A-S為主要CPU來控制相關(guān)周邊裝置。其主要架構(gòu)如下圖:
將AndesCore™ N968A-S整合在AHB-Lite Bus上,藉由APB Bridge和APB Bus溝通,而相關(guān)的周邊裝置則整合在APB Bus上。在本次范例中,主要會用到GPIO和INTC(中斷控制器)這兩個周邊裝置,在不同的中斷模式下,利用GPIO來觸發(fā)中斷,再透過INTC與CPU溝通,觀察不同中斷模式下中斷的處理方式。
2.1.1 Design Scenario in IVIC
在IVIC模式下,由GPIO觸發(fā)中斷(gpio_int signal),直接將中斷傳遞給CPU(int_req signal)。當CPU接收到中斷時,即可去處理相關(guān)的中斷處理程序。相關(guān)裝置之間的整合如下圖所示:
2.1.2 Design Scenario in EVIC
在EVIC模式下,由GPIO觸發(fā)中斷(gpio_int signal),INTC收到中斷后,會將中斷訊號和相關(guān)溝通訊號傳遞給CPU(int_req signal & evic_ireqval signal)。當CPU接收到中斷時,會將響應訊號拉起(evic_ireqack signal),告知INTC收到該中斷,并去處理相關(guān)的中斷處理程序。相關(guān)裝置之間的整合如下圖所示:
2.2 Example Code
以下將Reference Design中,就本次中斷處理模式相關(guān)的整合程序部分和測試程序部分,摘要出來說明。
2.2.1 整合程序部分
在系統(tǒng)整合部分,包含AndesCore™ N968A-S和INTC在不同的模式下,整合相關(guān)的訊號線,其中透過EVIC_MODE參數(shù)來進行不同模式間的切換。
AndesCore™ N968A-S相關(guān)RTL片斷:
evic_ireqval訊號在EVIC模式下由INTC觸發(fā)給CPU,在IVIC下可直接給予0值。int_req由INTC或中斷來源傳遞給CPU,告知CPU中斷產(chǎn)生。evic_ireqack在EVIC模式下由CPU觸發(fā)給INTC,告知INTC收到中斷。
n9_core n9_core (
...
`ifdef EVIC_MODE
.evic_ireqval (evic_ireqval),
`else
.evic_ireqval (1'b0),
`endif
.int_req (int_req),
.evic_ireqack (evic_ireqack),
...
INTC相關(guān)RTL片斷:
此中斷控制器可透過evic_mode這個輸入訊號,來決定該裝置是處于IVIC模式或是EVIC模式,因此,在EVIC模式下,給予1值,設(shè)定為EVIC模式,在IVIC下,給予0值,設(shè)定為IVIC模式。ireqack訊號在EVIC模式下由CPU觸發(fā)給INTC,告知INTC已收到中斷,在IVIC模式下則給予0值。
ncore_intctl intctl (
.PCLK (pclk),
.PRSTn (preset_n&~wd_rst),
`ifdef EVIC_MODE
.evic_mode (1'b1),
.ireqack (evic_ireqack),
`else
.evic_mode (1'b0),
.ireqack (1'b0),
`endif
.int_req (int_req),
.ireqval (evic_ireqval),
...
2.2.2 測試程序部分
在測試驗證部分,包含AndesCore™ N968A-S在不同中斷模式下的設(shè)置、INTC相關(guān)中斷狀態(tài)的設(shè)置和GPIO觸發(fā)中斷的設(shè)置。
AndesCore™ N968A-S相關(guān)程序片斷:
AndesCore™ N968A-S支持兩種中斷處理模式,透過CPU內(nèi)部的system register來設(shè)置。主要為設(shè)置Interruption Vector Base Register,該register的第13個bit用來定義CPU處在何種中斷處理模式。在EVIC模式下,需將該bit設(shè)置為1,在IVIC模式下,則將該bit設(shè)置為0。
!---------------!
!--- Set $IVB ---!
!---------------!
! [31:16] (IVBASE) = 16'$h0
! [15:14] (ESZ) = 2'b00 (4 bytes)
! [13] (EVIC) = 1'b0 (IVIC mode)
mfsr $r0, $IVB !read $IVB
ori $r0, $r0, #0x2000 !enable EVIC
mtsr $r0, $IVB !write $IVB
INTC相關(guān)程序片斷:
INTC通常支持不同的中斷觸發(fā)方式,包含Interrupt Masking、Interrupt Trigger Mode、Interrupt Trigger Level …等。在開始使用每個中斷來源之前,這些控制選項都必須在INTC上設(shè)定正確。
3. 模擬結(jié)果
將上述的Reference Design整合完成后,搭配測試程序進行仿真,并藉由波形圖來觀察不同中斷模式下,相關(guān)中斷訊號線的變化。
3.1 IVIC模擬結(jié)果
在IVIC仿真環(huán)境中,主要測試程序如下:
l 由GPIO觸發(fā)一中斷,并將中斷傳遞給CPU
l CPU接收到中斷后,執(zhí)行相對應的中斷處理程序
仿真結(jié)果如圖表11所示,當GPIO觸發(fā)中斷后,將中斷直接傳遞給CPU,在CPU端的int_req訊號線會觸發(fā),表示有中斷發(fā)生。當CPU收到中斷訊號后,接著會處理相對應的中斷處理程序。
3.2 EVIC模擬結(jié)果
在EVIC仿真環(huán)境中,主要測試程序如下:
l 由GPIO觸發(fā)一中斷
l 此時INTC設(shè)罝為EVIC模式,并將中斷訊號和相關(guān)溝通訊號傳遞給CPU
l CPU接收到中斷后,會將響應訊號拉起,告知INTC收到該中斷,并執(zhí)行相對應的中斷處理程序
仿真結(jié)果如圖表12所示,當GPIO觸發(fā)中斷后,INTC將中斷和相關(guān)溝通訊號(ireqval)傳遞給CPU,在CPU端的int_req訊號線和evic_ireqval訊號線會觸發(fā),表示有中斷發(fā)生。當CPU收到中斷訊號后,會將evic_ireqack訊號線拉起,告知INTC收到中斷。仿真結(jié)果如同章節(jié)1.2和圖表5所論述。
結(jié)語
在AndesCore™ N968A-S 所提供的兩種中斷模式里,其中的IVIC模式使用CPU內(nèi)的中斷控制器來處理中斷,此模式對用戶來說,只要將中斷來源和CPU端的中斷訊號連接即可,相當容易整合。若用戶所設(shè)計的系統(tǒng)里,中斷來源數(shù)目超過IVIC模式所支持,或者系統(tǒng)需要更復雜的優(yōu)先權(quán)選擇時,則可選用EVIC模式。在EVIC模式下,用戶需額外設(shè)計外部中斷控制器,并整合相關(guān)溝通訊號。因此,用戶可根據(jù)本身系統(tǒng)的復雜度和整合的難易度,來選擇適合的中斷處理模式。