S3C2410中斷分析_第1頁
S3C2410中斷分析_第2頁
S3C2410中斷分析_第3頁
S3C2410中斷分析_第4頁
S3C2410中斷分析_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、S3C2410中斷分析具體詳細解釋這段來自:具體寫的很詳細,后面畫個圖對流程進行詳細解釋,方便自己查閱,并結合wince里面底層中斷的代碼分析下。S3C2410有24個外部中斷引腳:EINT0EINT23,但是對于EINT0EINT3這4個外部中斷而言,使用比較簡單;對于其它20個而言,使用稍稍復雜一些。首先,來看S3C2410的中斷控制器,有6個中斷裁決器分為2級,第1級5個,第2級1個。第1級的5個裁決器管理32個中斷源,在這32個中斷源中有2個是保留的,24個是給內部中斷源的,而外部中斷只給了6個中斷:EINT0、 EINT1、EINT2、EINT3、EINT47、EINT823。EIN

2、T4EINT7、EINT8EINT23都是共享一個中斷。中斷控制器中主要的相關寄存器有:INTMSK、SRCPND、PRIORITY、INTPND,還有一個INTMOD。但是對于外部中斷還有幾個寄存器:EXTINTn、EINTMSK、EINTPEND等。對于外部中斷EINT0EINT3由于沒有共享,因此外部寄存器中只有EXTINT0和它們有關,進行中斷觸發電平信號的設置。但是對于其他的20個外部中斷而言,所有上面提到的寄存器都有關系。實際上對于 EINT4EINT23,實際上可以看作有3級屏蔽,第1級屏蔽是CPSR中的I-Bit和F-Bit,第2級屏蔽是EINTMASK(4:23每一位對應一個

3、相應的外部中斷),第3級屏蔽是INTMSK(Bit4、Bit5);對于EINT0EINT3而言,只是INTMSK中的 Bit0Bit3,因此在變成初始化時應該要特別注意。在外部中斷有中斷請求時,由于EINT47、EINT823分別共享中斷,因此在SRCPND中分別對應Bit4、Bit5,最終導致INTPND中的相應位置1(在任何時刻只能有一個位置1),但是如何分辨這些共享的中斷?可以通過查詢EINTPEND來進行(Bit4Bit23分別對應1個外部中斷)。由于在相應中斷后在服務例程中應將掛起寄存器中相應的位清0來清除未處理狀態,因此對于EINT47、EINT823這20個外部中斷的清除掛起寄存

4、器的順序是:1. EINTPEND(可能多位同事為1),方法:向要清0的位寫1,其它位寫0,但要注意由于第4位保留,因此不要試圖向第4位寫1,可能會導致不可預料的結果。2.SRCPND(可能多位同時為1),方法:向要清0的位寫1,其它位寫0。3.INTPND,方法:向其寫本身的數據(即INTPND=INTPND)。下面具體介紹各個寄存器的功能: SRCPND(Source Pending Register)寄存器有效位32位,可讀寫,每一位涉及到一個中斷源,SRCPND是主中斷源引腳寄存器,某個位被置1表示相應的中斷被觸發,但我們知道在同一時刻內系統可以觸發若干個中斷,只要中斷被觸發了,SRC

5、PND的相應位便被置1,也就是說SRCPND 在同一時刻可以有若干位同時被置1,另外,此寄存器不受中斷控制器的優先權邏輯的影響。如果此中斷沒有被INTMSK寄存器屏蔽、或者是快中斷(FIQ的話,它將被進一步處理。通過寫數據到這個寄存器能清除SPCPND相應的位。 INTMODE(Interrupt Mode Register)寄存器有效位為32位,可讀寫,每一位與SRCPND中各位相對應,它的作用是指定該位相應的中斷源處理模式(IRQ還是FIQ)。若某位為0,則該位相對應的中斷按IRQ模式處理,為1則以FIQ模式進行處理,該寄存器初始化值為0x00000000,即所有中斷皆以IRQ模式進行處理

6、。此中斷控制器中只有一個中斷源能用FIQ mode(在緊急中斷下使用FIQ mode),因此INTMODE僅有一位能置1。 INTMSK(Interrupt Mask Register)寄存器有效位為32位,可讀寫,INTMSK為主中斷屏蔽寄存器與SRCPND寄存器對應,它的作用是決定該位相應的中斷請求是否被處理。若某位被設置為1,則該位相對應的中斷產生后將被忽略(CPU不處理該中斷請求),設置為0則CPU對其進行處理。該寄存器初始化值為0xFFFFFFFF,既默認情況下所有的中斷都是被屏蔽的。 PRIORITY(IRQ PRIORITY Control Register)寄存器有32位,有效

7、位20:0,可讀寫,此寄存器的作用是如果有幾個中斷源同時觸發,按照圖2.2.1的流向,假如這幾個中斷源都沒被屏蔽,并且都是IRQ模式,因此就要判定哪個中斷源的優先級最高,使其在INTPND寄存器中對應位置1,CPU轉向相應的中斷服務程序,讓中斷服務程序來處理相應的中斷請求。 INTPND(Interrupt Pending Register)寄存器有效位為32位,可讀寫,看起來和SRCPND寄存器一樣,其實他們在功能上有著重大的區別。他在某一時刻只能有1個位被置1,INTPND 某個位被置1(該位對應的中斷在所有已觸發的中斷里具有最高優先級且該中斷沒有被屏蔽),則表示CPU即將或已經在對該位相

8、應的中斷進行處理。因此SRCPND寄存器說明有什么中斷被觸發了,而INTPND寄存器說明CPU即將或已經在對某一個中斷進行處理。 INTOFFSET(Interrupt Offset Register)寄存器有效位為32位,只讀,此寄存器的值顯示IRQ mode的哪個中斷請求在INTPND寄存器中,通過清SRCPND和INTPND這位能自動清除,FIQ mode中斷不會影響INTOFFSET寄存器,因此此寄存器僅對IRQ mode中斷有效。 SUBSRCPND(Sub Source Pending Register)寄存器有32位,有效位10:0,可讀寫,它們中的每一位分別代表一個中斷源,SR

9、CPND是主中斷源引腳寄存器,它是副中斷源引腳寄存器,情況類似SRCPND。 INTSUBMSK(Interrupt Sub Mask Register)寄存器有32位但有效位為11位,可讀寫,如果mask bit位是0,此中斷請求被服務,情況類似INTMSK。圖解分析圖上面部分表述內部中斷流程,產生了兩個中斷INT_TXD和INT_RTC,INT_TXD經過SubMask后為INT_UART0,這里SRCPND有兩個中斷標志,最后假設INT_UART0優先級高,最后在INTPND里面INT_UART0置一了。子屏蔽模塊里面其實主要是一些同一控制器有多個中斷標志的情況,可以這樣認為就是控制器本

10、身的標志位,三星這樣做反而有點迷惑人,成熟廠家一般都是作為一個模塊控制器本身的寄存器標志來做的。圖下部分為外部中斷產生流程,外部24個中斷分為3組,在達到內部中斷流程入口時候,分為了EINT0EINT1EINT2EINT3EINT4_7EINT8_23這六個標志,到達NO_SUB REQ SOURCE,為非子屏蔽掩碼部分。故當外部中斷的EINT4_7與EINT8_23到來時,需要去讀取EINTMASK與EINTPEND來確定為哪個中斷源。INTPND標志置一后:1、NO_SUB_REQ_SOURCE則直接清楚SRCPND和INTPND對應標志位即可。2、SUB_REQ_SOURCE則在取得對應

11、子中斷號后清除SUBSRCPND、SRCPND和INTPND對應標志位。3、EXTINT,EINT0EINT3與NO_SUB_REQ_SOURCE相同,EINT4_7EINT8_23先清除EINTMASK和EINTPEND后再進行與NO_SUB_REQ_SOURCE相同動作。具體代碼這里分析Wince模擬器里面的中斷處理代碼就很清除了。ULONG OEMInterruptHandler(ULONG ra UINT32 sysIntr = SYSINTR_NOP; UINT32 irq, irq2 = OAL_INTR_IRQ_UNDEFINED, mask; fInterruptFlag =

12、TRUE; / Signal OemIdle to come out of idle. / Get pending interrupt(s irq = INREG32(&g_pIntrRegs-INTOFFSET; / 系統心臟脈動定時器,不需要屏蔽中斷處理,直接就按照NO_SUB_REQ_SOURCE進行。 if (irq = IRQ_TIMER4 / Clear the interrupt OUTREG32(&g_pIntrRegs-SRCPND, 1 INTPND, 1 IRQ_TIMER4; / Rest is on timer interrupt handler sysIntr =

13、OALTimerIntrHandler(; / 調試中斷用,需要屏蔽后再按照NO_SUB_REQ_SOURCE處理,等系統將任務處理結束后再行開啟mask。 else if (irq = IRQ_TIMER2 / Mask and clear the interrupt. mask = 1 INTMSK, mask; OUTREG32(&g_pIntrRegs-SRCPND, mask; OUTREG32(&g_pIntrRegs-INTPND, mask; / The rest is up to the profiling interrupt handler (if profiling /

14、is enabled. / if (g_pProfilerISR sysIntr = g_pProfilerISR(ra; else #ifdef OAL_ILTIMING if (g_oalILT.active g_oalILT.isrTime1 = OALTimerCountsSinceSysTick(; g_oalILT.savedPC = 0; g_oalILT.interrupts+; #endif if (irq = IRQ_EINT4_7 | irq = IRQ_EINT8_23 / Find external interrupt number/外部兩組中斷源,先找出具體中斷號,

15、再將其清除,并將該中斷號給屏蔽,等處理結束后再行開啟 mask = INREG32(&g_pPortRegs-EINTPEND; mask &= INREG32(&g_pPortRegs-EINTMASK; mask = (mask (mask - 1 5; irq2 = IRQ_EINT4; while (mask != 0 mask = 1; irq2+; / Mask and clear interrupt mask = 1 EINTMASK, mask; OUTREG32(&g_pPortRegs-EINTPEND, mask; / calculate mask for primary

16、 interrupt mask = 1 irq; / update irq irq = irq2; else / 其它NO_SUB_REQ_SOURCE,按照NO_SUB_REQ_SOURCE處理,該處需要屏蔽。 mask = 1 INTMSK, mask; / 清除中斷標志 OUTREG32(&g_pIntrRegs-SRCPND, mask; OUTREG32(&g_pIntrRegs-INTPND, mask; / First find if IRQ is claimed by chain sysIntr = NKCallIntChain(UCHARirq; if (sysIntr =

17、SYSINTR_CHAIN | !NKIsSysIntrValid(sysIntr / IRQ wasnt claimed, use static mapping sysIntr = OALIntrTranslateIrq(irq; / unmask interrupts in case its NOP or invalid if (SYSINTR_NOP = sysIntr if (OAL_INTR_IRQ_UNDEFINED = irq2 / Unmask the primary interrupt CLRREG32(&g_pIntrRegs-INTMSK, mask; else / Un

18、mask the external interrupt mask = 1 EINTMASK, mask; return sysIntr;/開啟中斷BOOL OALIntrEnableIrqs(UINT32 count, const UINT32 *pIrqs BOOL rc = TRUE; UINT32 i, mask, irq; OALMSG(OAL_INTR&OAL_FUNC, ( L+OALIntrEnableIrqs(%d, 0x%08xrn, count, pIrqs ; for (i = 0; i count; i+ / Give BSP chance to enable irq on subordinate interrupt controller irq = BSPIntrEnableIrq(pIrqsi; if (irq = OAL_INTR_IRQ_UNDEFINED continue; / Depending on IRQ number use internal or external mask register if (irq INTMSK, 1 irq; else if (irq INTMSK, 1 EINTMASK, 1 (irq - IRQ_EINT4 + 4; else if (irq = IRQ_EINT23 /EINT8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論