DSP TMS320C6455 中断解析
首先定義3個術語:
- 系統事件(System Event):CPU內部或外部產生的信號,用來通知CPU有些事情已經發生了和/或 需要響應。
- 中斷(Interrupts):由于內部或外部硬件信號(EVENT)的出現,用來提供重定向正常程序流的方法。
- 異常(Exceptions):也會重定向程序流,但它們通常只對應系統內的一個錯誤狀態。
C64x+CPU提供了2種類型的異步信號服務:中斷和異常。中斷提供了重定向正常程序流的方法,異常也會重定向程序流,但它們通常與系統的錯誤狀態相關聯。
C64x+CPU可以接受12個可屏蔽/可配置的中斷,1個可屏蔽的異常和1個不可屏蔽的中斷/異常。CPU也可以響應各種內部異常情況(TMS320C64x / C64x + DSP CPU和指令集參考指南(SPRU732)中記錄了這些異常)。megamodule包含一個中斷控制器,該控制器最多可將124個系統事件路由到CPU中斷/異常輸入。 這124個事件可以直接連接到可屏蔽中斷,也可以組合成中斷或異常。 這些不同的路由選擇為事件處理提供了極大的靈活性。當向CPU發出中斷信號并且已經有該中斷的掛起位時,將產生一個錯誤事件。 除路由事件外,中斷控制器還會檢測CPU何時錯過中斷。 您可以使用此錯誤事件在CPU錯過實時事件時通知CPU。 INTC硬件將錯過的中斷號保存在寄存器中,以便可以采取糾正措施。
1 結構框圖和特性
上圖為C64x+Megamodule模塊的功能框圖。共有128個系統事件(system event)作為中斷控制器的輸入,既包括內部生成的事件(在megamodule內部)也包括芯片級事件(chip-level)。除了這128個事件,INTC寄存器還接收非屏蔽(NMEVENT)和復位事件(RESET),并且直接路由到CPU。中斷控制器輸出給CPU的信號為以下四種:
| EXCEP | 1個可屏蔽的硬件異常 |
| INT4~INT15 | 12個可屏蔽的硬件中斷 |
| NMI | 1個不可屏蔽的信號(non-maskable),用戶可以用作中斷或異常 |
| RESET | 一個復位信號 |
注:更多的中斷和異常信號可以參考文檔: TMS320C64x/C64x+ DSP CPU and Instruction Set Reference Guide (SPRU732)
中斷控制器通過下列模塊來解決事件到終端和異常的路由問題。
| Interrupt Selector | 將任意系統事件路由到12個可屏蔽中斷 |
| Event Combiner | 將大量的系統事件組合為4個,減少事件數量 |
| Exception Combiner | 將系統事件歸結為1個硬件異常輸入 |
2 中斷控制器架構
C64x+中斷控制器用來提供靈活的系統事件管理。這是通過寄存器來實現的,如下表。
| EVTFLAG [3:0] | Event Flag Registers | Status |
| EVTCLR [3:0] | Event Clear Registers | Command |
| EVTSET [3:0] | Event Set Registers | Command |
| EVTMASK [3:0] | Event Mask Registers | Control |
| MEVTFLAG [3:0] | Masked Event Flag Registers | Status |
| EXPMASK [3:0] | Exception Mask Registers | Control |
| MEXPFLAG [3:0] | Masked Exception Flag Registers | Status |
| INTMUX [3:1] | Interrupt Mux Registers | Control |
| AEGMUX [1:0] | Advanced Event Generator Mux Registers | Control |
| INTXSTAT | Interrupt Exception Status Register | Status |
| INTXCLR | Interrupt Exception Clear Register | Command |
| INTDMASK | Dropped Interrupt Mask Register | Control |
2.1 Event Registers
中斷控制器通過以下3個寄存器組來管理系統事件狀態。
- Event flag registers (EVTFLAGx)
- Clear flag registers (EVTCLRx)
- Set flag registers (EVTSETx)
Event flag registers捕捉中斷控制器收到的所有系統事件。有4個32位的寄存器來負責這124個系統事件,每個系統事件映射到Event flag registers中的一個標志位(flag bit EFXX)。剩下的4個位EVTFLAG0 (EF03:EF00) 與系統事件無關,這4個位為保留位,且總為0。相反,事件00~03對應的系統事件是中斷控制器內部通過Event Combiner生成的,并路由到Interrupt Selector(見圖7-1)。
Event flags(EFxx)是鎖存寄存器位,收到事件后就會變為1。EVTFLAGx寄存器是只讀的,且必須通過 Event Clear registers EVTCLR[3:0]清0。
Event Clear registers是只寫的,通過往對應的為寫1就能清0。
Event Set registers是只寫的,通過往對應的為寫1就能置1。使用Event Set registers可以手動設置Event flag registers中的任何位。這在測試中斷服務程序時,使用Event Set registers生成中斷會有所幫助。
中斷控制器使用Event Clear registers和Event Set registers組,而不是直接寫入Event flag registers,這樣可以防止潛在的競爭情況(potential race conditions)。 如果沒有這些額外的寄存器,CPU在對這些標志位進行讀-修改-寫的操作過程過程中,可能會意外清零事件標志設置。
如果在同一周期期間接收到新事件,該事件位會被EVTCLRx寄存器清0,該事件輸入會優先作為丟失事件。
2.2 Event Combiner
事件組合器(event combiner)允許多個系統事件組合成一個單個事件。組合事件路由到中斷選擇器(interrupt selector)。這種設計使得CPU即使只有12個能用的中斷也能服務所有的系統事件。
事件組合器的基本概念是對system event flags的子集執行“或(OR)”運算。 OR操作的結果變成了新的“組合”事件。
事件組合器將124個系統事件分為四個組。 第一組包括事件4到31,第二組包括事件32到63,第三組包括事件64到95,第四組包括事件96到127。您可以組合每個組中的事件作為新的“組合” ”事件。 這些新事件稱為EVT0,EVT1,EVT2和EVT3。 這些事件與原始的124個系統事件一起路由到中斷選擇器,總共有128個事件。
每個組都有1個事件屏蔽寄存器(event mask register),其通用結構如下。
事件屏蔽寄存器(event mask register)中的事件屏蔽位用于使能/屏蔽應組合的系統事件。 默認情況下,該寄存器為零,因此所有系統事件都是未屏蔽的,組合形成對應的EVTx。 要屏蔽事件源,必須將相應的屏蔽位設置為1。請注意,事件0到3的事件屏蔽位是保留的,并且始終被屏蔽。
例如:
事件組合器還提供了事件標志寄存器( event flag registers)的屏蔽視圖,如下。
屏蔽后事件標志寄存器( masked event flag)的事件,其實就是事件標志寄存器( event flag registers)的內容經過屏蔽后的事件。 通過讀取屏蔽后事件標志寄存器( masked event flag),CPU僅看到組合事件的事件標志(EVT [3:0]),這在處理組合事件的中斷程序中很有用。
例子:
當處理一個組合事件時,你必須:
1.讀取與組合事件EVTx對應的MEVTFLAGx寄存器;
2.檢查第一個掛起(即flagged)事件;
3.將此MEVTFLAGx值寫入EVTCLRx寄存器;
4.處理步驟2中指示的事件(如,進入對應的中斷服務程序);
5.重復步驟1至 4直到MEVTFLAGx寄存器= 0;
此過程僅評估和清除在EVTx上組合的那些事件。 此外,即使在EVTFLAGx寄存器中置位了,在EVTMASKx寄存器中屏蔽的任何事件都不會清0(也無需清0)(這使您可以使用它們生成異常)。
注意:CPU應該迭代步驟1到4,直到在中斷服務程序內返回之前沒有找到掛起位為止。 這樣可以確保在中斷服務程序執行中接收到的所有事件都被捕獲到(還要記住,如果在EVTCLRy [x]寄存器中清除了事件EVTx的標志的同時接收到了事件EVTx,則不會將其清除)。
2.3 Interrupt Selector
2.3.1 中斷選擇器操作
CPU有12個可屏蔽中斷(CPUINT4~CPUINT15),中斷選擇器運行128個系統事件的任意一個路由到12個的CPU中斷輸入。這128個事件要么是事件要么是組合事件。
除了中斷選擇器之外,事件組合器還允許使用靈活的中斷路由方案。 INTC模塊的這種靈活性允許在mega模塊中處理大量系統中斷。 它還允許在CPU內同時處理大量中斷,從而提高了中斷效率。
中斷選擇器包含中斷多路復用寄存器INTMUX [3:1](如下圖),可通過事件號對12個可用CPU中斷中的中斷源進行編程。 CPU中斷的順序(CPUINT4至CPUINT15)確定中斷的優先級。 由于任何中斷服務程序都可以是原子的(不可嵌套),因此CPU中斷優先級僅適用于掛起的中斷。
2.3.2 Interrupt Error Event(中斷錯誤事件)
每當CPU檢測到中斷已被丟棄時,C64x + CPU連同中斷控制器都可以生成系統事件(EVT96)。 當接收到CPU中斷且相關的CPU的中斷標志位置1時,將生成此事件。 此錯誤事件可能表明程序員可能在代碼中遇到問題,例如是否長時間禁用了中斷或不可中斷代碼段是否太長。
由于中斷丟棄檢測邏輯在CPU內部,因此只能檢測到來自單個系統事件的中斷。 基于組合事件的中斷丟棄僅表明該組中的一個或多個中斷引起了錯誤。
當CPU檢測到丟失錯誤情況時,它將信息傳遞回中斷控制器的中斷異常狀態寄存器(INTXSTAT),該寄存器記錄丟失的中斷號并聲明系統事件。 該寄存器描述如圖7-38。
由回到系統事件EVT96,由于INTXERR只能保存一個droped CPU ID,因此INTERR(EVT96)僅報告檢測到的第一個丟棄的中斷。 中斷異常狀態通過異常清除寄存器(INTXCLR)清除(見圖7-39),該寄存器僅由一個清除位組成。 將1寫入INTXCLR寄存器的CLEAR字段會將INTXSTAT寄存器(見圖7-38)復位為0。只有在硬件清除狀態后,才能檢測到新的IDROPx事件。
為丟棄中斷錯誤事件提供服務時,服務程序應:
1.讀取INTXSTAT寄存器。
2.檢查錯誤情況。
3.通過INTXCLR寄存器清除錯誤。
為防止一個或多個CPU中斷產生丟失的中斷錯誤,可通過對丟棄中斷屏蔽寄存器(INTDMASK)進行編程來忽略它們。
2.4 Exception Combiner(異常組合器)
C64x + CPU可以單事件輸入,用于系統級可屏蔽的異常。 此輸入由EXCEP表示。 異常組合器允許將多個系統事件組合到圖7-12中的單個異常事件中。 即使只有一個CPU異常輸入可用,這也允許CPU處理所有可用的系統事件。
異常組合器允許系統設計人員選擇 system event flags的子集執行“或(OR)”運算以確定EXCEP值。
注意:復位和NMI也顯示在此圖中。 實際上,當在C64x + CPU中使能了異常時,NMI信號將用作不可屏蔽的異常輸入。 這兩個信號與其他各種CPU異常一起在CPU內組合在一起。
為了僅允許系統事件的一個子集生成CPU異常,異常組合器提供了一組四個屏蔽寄存器EXPMASK [3:0],用于禁用不需要的事件。 由于只有一個異常輸入到CPU,因此所有屏蔽寄存器可以協同工作將多達128個事件組合為一個EXCEP輸出。 這使CPU可以處理所有可用的系統異常。
EXPMASKx寄存器的默認值為全1。 這意味著所有事件都被屏蔽; 因此,除非對該寄存器進行編程,否則任何系統事件都不會產生異常。
與事件組合器類似,異常組合器提供一組屏蔽后異常標志寄存器(MEXPFLAGx)。通過讀取屏蔽后異常標志寄存器,CPU可以看到與CPU的EXCEP輸入有關的事件標志。
CPU應該運行異常服務程序以確定異常原因,并在收到異常后響應事件。 在提供異常服務時,服務程序必須首先確定該異常是通過不可屏蔽異常還是由EXCEP信號在CPU內部生成的。
如果EXCEP是導致異常的原因,則程序應讀取屏蔽的異常標志寄存器(MEXPFLAG [3:0]),以確定哪些未屏蔽的事件觸發了異常。
服務組合異常時,必須:
1.讀取MEXPFLAG [3:0]寄存器。
2.檢查掛起事件。
3.將MEXPFLAG [3:0]的值寫入EVTCLR [3:0]寄存器。
- CPU從第1步到第3步進行迭代,直到從異常服務例程返回之前沒有找到掛起事件為止。 這樣可以確保捕獲異常服務例程中接收到的所有事件。
將MEXPFLAGx值與EVTCLRx寄存器一起使用,只會清除那些合并生成EXCEP的事件。 即使在EVTFLAGx寄存器中進行了設置,也無需清除EXPMASKx中被掩蔽的任何事件。 這使它們可用于生成組合的中斷事件。
注意:如果要求CPU響應任何新的異常,則步驟4至關重要。 有兩個事實表明為什么會這樣: - 當任何未屏蔽的事件標志輸入均處于活動狀態時,異常組合器的輸出即處于活動狀態。
- CPU認為異常請求是從0到1的變化。
因此,必須清除所有未屏蔽的事件標志,然后CPU才能識別EXCEP上新的從0到1的變化。
3 C64x+ Megamodule Events
C64x + megamodule的各個組件都會生成許多事件。 這些事件被路由到中斷控制器,以便在斷言時可以由CPU處理。顯示為可用事件(4至8、10和15至95)的事件為芯片級事件。 每個C64x +設備都可以根據需要使用這些事件輸入。 有關如何使用這些可用事件的更多信息,請參見特定設備的數據手冊。
4 Interrupt Controller - CPU Interaction
4.1 CPU-中斷控制器接口
由異常組合器和中斷選擇器產生的中斷控制器的輸出提供給C64x + CPU。十二個中斷信號反映在CPU的中斷標志寄存器(IFR)中,如圖7-14所示。
必須使能中斷才能讓CPU識別它們。CPU需要中斷允許寄存器(IER)和中斷任務寄存器(ITSR.GIE)中的全局中斷允許字段進行使能。
另請注意,異常信號(EXCEP)記錄在圖7-15中的CPU異常標志寄存器(EFR)中。 您必須先使能異常,然后才能識別所示的異常標志寄存器(EFR)。 重置設備后將禁用異常識別,以簡化系統設計并實現向后兼容性。 您可以通過在ITSR寄存器(ITSR)中設置全局異常使能字段(GEE)來打開異常。 在使能任何中斷之前,應先使能異常,以確保在更改其模式(異常與中斷)時不會收到NMI。
當CPU中未使能系統異常時,不可屏蔽中斷(NMI)充當中斷,并且在接收到該中斷時會將標志發布到IFR寄存器的BIT1字段中。 在CPU中使能系統異常時; 該標志不會設置。 而是在異常標志寄存器(EFR)中標識異常源,以表示該源是NMI,EXCEP,內部異常還是軟件異常(SWE / SWENR)。
所有NMI處理都共享NMI中斷向量,無論您是將其用作中斷還是異常。 在SWENR生成異常而不是SWE指令的情況下,CPU僅將其REP寄存器用作向量,而不是NMI向量。 更多信息參見文檔:TMS320C64x/C64x+ DSP CPU and Instruction Set Reference Guide (SPRU732) .
4.2 CPU中斷事件服務
對于CPU服務的單事件中斷(直接在中斷選擇器中指定系統事件)的情況,無需讀取或清除中斷控制器中的事件標志(EVTFLAGx)寄存器。
但是,在服務組合的系統事件時,必須在中斷服務程序或異常服務程序中使用事件標志。 這些標志用于確定引發中斷或異常的事件。 換句話說,CPU的中斷標志寄存器(或異常標志寄存器)告訴CPU發生了組合的事件,然后服務例程必須使用事件標志寄存器來確定確切的原因。
同樣重要的是要注意,在服務程序中,必須由軟件清除相應的事件標志寄存器位,以便接收后續事件。 如果事件標志未清除,則不會識別新的系統事件。 新的系統事件甚至無法被識別為丟棄的中斷。 這是因為CPU的丟棄中斷邏輯適用于CPU中斷輸入(而不是中斷控制器事件輸入)。 由于事件是在中斷控制器中組合的,因此CPU在這里沒有可見性。
在許多系統中,可能很想讀取服務程序,然后清除整個事件標志寄存器(EVTFLAGx)。 雖然這在某些系統上可以正常工作,但您必須注意,某些事件標志不會被任何系統代碼輪詢。 如果必須輪詢特定事件(系統中的某些代碼偶爾讀取該事件,而不是讓該事件中斷CPU),則不加選擇地清除所有事件標志位可能會導致意外結果。
歡迎關注我的公眾號:槑槑的技術棧。前面兩個字念meimei,二聲,哈哈。
總結
以上是生活随笔為你收集整理的DSP TMS320C6455 中断解析的全部內容,希望文章能夠幫你解決所遇到的問題。