<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM(920T)異常和中斷映射過(guò)程

          ARM(920T)異常和中斷映射過(guò)程

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          ARM(920T)有四種異常(復(fù)位、未定義指令、預(yù)取指、數(shù)據(jù)中止)和三個(gè)中斷(軟件中斷、IRQ中斷、FIQ中斷)

          因此有七個(gè)向量,向量表如下:

          本文引用地址:http://www.ex-cimer.com/article/201611/319024.htm


          1.跳轉(zhuǎn)

          Reset
          bHandlerReset ;處理器默認(rèn)運(yùn)行模式是 中斷向量0x00000000

          bHandlerUndef 中斷向量為0x00000004
          bHandlerSWI中斷向量為0x00000008
          bHandlerPabort中斷向量為0x0000000c
          bHandlerDabort中斷向量為0x00000010
          b. ;.表示當(dāng)前地址,表示當(dāng)前地址死循環(huán) 0x00000014保留
          bHandlerIRQ 中斷向量為0x00000018
          bHandlerFIQ 中斷向量為0x0000001c

          CPU內(nèi)核默認(rèn)的中斷向量(VA)如上,如果當(dāng)前未開(kāi)啟MMU地址重映射,則PA的中斷向量也為上面所述。

          2.第一次映射

          LTORG
          HandlerFIQ HANDLER HandleFIQ
          HandlerIRQ HANDLER HandleIRQ
          HandlerUndef HANDLER HandleUndef
          HandlerSWI HANDLER HandleSWI
          HandlerDabort HANDLER HandleDabort
          HandlerPabort HANDLER HandlePabort

          宏定義如下:

          MACRO
          $HandlerLabelHANDLER$HandleLabel;

          $HandlerLabel
          subsp,sp,#4;空出一個(gè)字
          stmfdsp!,{r0};將R0入堆棧,此時(shí)的R0存在的數(shù)據(jù)是前一個(gè)模式所遺留的,必須加以保存
          ldrr0,=$HandleLabel;RAM中的中斷向量表

          ldrr0,[r0] ;取此中斷第一個(gè)字里面的內(nèi)容
          strr0,[sp,#4];先將SP指針加4個(gè)字節(jié),后把R0存入,不更新sp
          ldmfdsp!,{r0,pc};進(jìn)行跳轉(zhuǎn)
          MEND

          如果是IRQ中斷則進(jìn)入下列子程序進(jìn)行IRQ子中斷辨別

          ldrr0,=HandleIRQ;判斷是哪個(gè)IRQ的子程序,建立IRQ中斷在內(nèi)存指針的重映射
          ldrr1,=IRQ_SEV
          strr1,[r0]

          IRQ_SEV;子中斷判斷并跳轉(zhuǎn)
          subsp,sp,#4
          stmfdsp!,{r8-r9}
          ldrr9,=INTOFFSET




          ldrr9,[r9]
          ldrr8,=HandleEINT0
          addr8,r8,r9,lsl #2
          ldrr8,[r8]
          strr8,[sp,#8]
          ldmfdsp!,{r8-r9,pc}

          內(nèi)存中定義一個(gè)中斷地址表存放中斷服務(wù)程序的起始地址(在高級(jí)語(yǔ)言中指定)

          ALIGN
          AREARWDATA,DATA,READWRITE
          MAP_ISR_STARTADDRESS
          HandleReset# 4 ;#--Field:定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域,該域?yàn)?個(gè)字節(jié)(32bit)
          HandleUndef # 4
          HandleSWI # 4
          HandlePabort # 4
          HandleDabort # 4
          HandleReserved # 4
          HandleIRQ # 4
          HandleFIQ # 4
          ;以下是IRQ的子中斷
          HandleEINT0 # 4
          HandleEINT1 # 4
          HandleEINT2 # 4
          HandleEINT3 # 4
          HandleEINT4_7# 4
          HandleEINT8_23# 4
          HandleRSV6# 4
          HandleBATFLT # 4
          HandleTICK # 4
          HandleWDT# 4
          HandleTIMER0 # 4
          HandleTIMER1 # 4
          HandleTIMER2 # 4
          HandleTIMER3 # 4
          HandleTIMER4 # 4
          HandleUART2 # 4
          HandleLCD # 4
          HandleDMA0# 4
          HandleDMA1# 4
          HandleDMA2# 4
          HandleDMA3# 4
          HandleMMC# 4
          HandleSPI0# 4
          HandleUART1# 4
          HandleRSV24# 4
          HandleUSBD# 4
          HandleUSBH# 4
          HandleIIC # 4
          HandleUART0 # 4
          HandleSPI1 # 4
          HandleRTC # 4
          HandleADC # 4
          END

          3.第二次映射(將中斷服務(wù)子程序地址放入內(nèi)存中的中斷地址表)

          #define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0))
          #define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))
          #define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))
          #define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))
          #define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))
          #define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))
          #define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))
          #define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c))

          #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
          #define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x24))
          #define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28))
          #define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))
          #define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30))
          #define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))
          #define pISR_NOTUSED6 (*(unsigned *)(_ISR_STARTADDRESS+0x38))
          #define pISR_BAT_FLT (*(unsigned *)(_ISR_STARTADDRESS+0x3c))
          #define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x40))
          #define pISR_WDT (*(unsigned *)(_ISR_STARTADDRESS+0x44))
          #define pISR_TIMER0 (*(unsigned *)(_ISR_STARTADDRESS+0x48))
          #define pISR_TIMER1 (*(unsigned *)(_ISR_STARTADDRESS+0x4c))
          #define pISR_TIMER2 (*(unsigned *)(_ISR_STARTADDRESS+0x50))
          #define pISR_TIMER3 (*(unsigned *)(_ISR_STARTADDRESS+0x54))
          #define pISR_TIMER4 (*(unsigned *)(_ISR_STARTADDRESS+0x58))
          #define pISR_UART2 (*(unsigned *)(_ISR_STARTADDRESS+0x5c))
          #define pISR_LCD (*(unsigned *)(_ISR_STARTADDRESS+0x60))
          #define pISR_DMA0 (*(unsigned *)(_ISR_STARTADDRESS+0x64))
          #define pISR_DMA1 (*(unsigned *)(_ISR_STARTADDRESS+0x68))
          #define pISR_DMA2 (*(unsigned *)(_ISR_STARTADDRESS+0x6c))
          #define pISR_DMA3 (*(unsigned *)(_ISR_STARTADDRESS+0x70))
          #define pISR_SDI (*(unsigned *)(_ISR_STARTADDRESS+0x74))
          #define pISR_SPI0 (*(unsigned *)(_ISR_STARTADDRESS+0x78))
          #define pISR_UART1 (*(unsigned *)(_ISR_STARTADDRESS+0x7c))
          #define pISR_NOTUSED24 (*(unsigned *)(_ISR_STARTADDRESS+0x80))
          #define pISR_USBD (*(unsigned *)(_ISR_STARTADDRESS+0x84))
          #define pISR_USBH (*(unsigned *)(_ISR_STARTADDRESS+0x88))
          #define pISR_IIC (*(unsigned *)(_ISR_STARTADDRESS+0x8c))
          #define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90))
          #define pISR_SPI1 (*(unsigned *)(_ISR_STARTADDRESS+0x94))
          #define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x98))
          #define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x9c))

          pISR_UNDEF = (unsigned)HaltUndef; //將中斷處理程序入口地址放入中斷變量地址所指向的內(nèi)存空間
          pISR_SWI = (unsigned)HaltSwi; //往中斷地址表中填入中斷服務(wù)子程序地址
          pISR_PABORT = (unsigned)HaltPabort;
          pISR_DABORT = (unsigned)HaltDabort;

          pISR_EINT1 = (unsigned)Eint1Int;



          關(guān)鍵詞: ARM920T異常中斷映

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();