在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<s id="cmphk"><label id="cmphk"></label></s>
    <span id="cmphk"><var id="cmphk"></var></span>
    <dfn id="cmphk"><var id="cmphk"></var></dfn>
    <menu id="cmphk"><thead id="cmphk"></thead></menu>

    <address id="cmphk"></address>

      <dfn id="cmphk"></dfn>
      
      
      <span id="cmphk"></span>

      <object id="cmphk"><tt id="cmphk"></tt></object>
      1. 新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM 向量中斷和非向量中斷

        ARM 向量中斷和非向量中斷

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        44B0的向量中斷響應(yīng)過(guò)程是中斷發(fā)生后芯片會(huì)自動(dòng)跳轉(zhuǎn)到0x00000018處執(zhí)行指令

        ENTRY
        b ResetHandler ; 0x00
        b HandlerUndef ; 0x04
        b HandlerSWI ; 0x08
        b HandlerPabort ; 0x0c
        b HandlerDabort ; 0x10
        b . ; 0x14
        b HandlerIRQ ; 0x18
        b HandlerFIQ ; 0x1c

        本文引用地址:http://www.biyoush.com/article/201611/319146.htm

        ldr pc,=HandlerEINT0 ; 0x20
        ldr pc,=HandlerEINT1
        ldr pc,=HandlerEINT2
        ldr pc,=HandlerEINT3
        ldr pc,=HandlerEINT4567
        ldr pc,=HandlerTICK ; 0x34
        b .
        b .
        ldr pc,=HandlerZDMA0 ; 0x40
        ldr pc,=HandlerZDMA1
        ldr pc,=HandlerBDMA0
        ldr pc,=HandlerBDMA1
        ldr pc,=HandlerWDT
        ldr pc,=HandlerUERR01 ; 0x54
        b .
        b .
        ldr pc,=HandlerTIMER0 ; 0x60
        ldr pc,=HandlerTIMER1
        ldr pc,=HandlerTIMER2
        ldr pc,=HandlerTIMER3
        ldr pc,=HandlerTIMER4
        ldr pc,=HandlerTIMER5 ; 0x74
        b .
        b .
        ldr pc,=HandlerURXD0 ; 0x80
        ldr pc,=HandlerURXD1
        ldr pc,=HandlerIIC
        ldr pc,=HandlerSIO
        ldr pc,=HandlerUTXD0
        ldr pc,=HandlerUTXD1 ; 0x94
        b .
        b .
        ldr pc,=HandlerRTC ; 0xa0
        b .
        b .
        b .
        b .
        b .
        b .
        ldr pc,=HandlerADC ; 0xb4

        根據(jù)44b0的DATASEET,0x18處放置的指令為b HandlerIRQ; 當(dāng)程序跳轉(zhuǎn)到這里執(zhí)行時(shí), 芯片在這個(gè)地址取到的代碼已經(jīng)被后面程序中的branch instructions取代了,舉個(gè)例子,如果芯片EINT3發(fā)生中斷,芯片會(huì)跳轉(zhuǎn)到0x18處執(zhí)行,先在0x18處取指,這時(shí)取到的指令已經(jīng)不是b HandlerIRQ,b HandlerIRQ已經(jīng)被芯片自動(dòng)替換成了ldr pc,=HandlerEINT3,然后芯片再執(zhí)行此條指令。

        非向量中斷的代碼如下:

        ENTRY
        b ResetHandler ; for debug
        b HandlerUndef ; handlerUndef
        b HandlerSWI ; SWI interrupt handler
        b HandlerPabort ; handlerPAbort
        b HandlerDabort ; handlerDAbort
        b . ; handlerReserved
        b IsrIRQ
        b HandlerFIQ
        . . . . . .

        IsrIRQ
        sub sp,sp,#4 ; reserved for PC
        stmfd sp!,{r8-r9}
        ldr r9,=I_ISPR
        ldr r9,[r9]
        mov r8,#0x0
        0movs r9,r9,lsr #1
        bcs %F1
        add r8,r8,#4
        b %B0
        1ldr r9,=HandleADC
        add r9,r9,r8
        ldr r9,[r9]
        str r9,[sp,#8]
        ldmfd sp!,{r8-r9,pc}
        . . . . . .

        HandleADC # 4
        HandleRTC # 4
        HandleUTXD1 # 4
        HandleUTXD0 # 4
        . . . . . .

        HandleEINT3 # 4
        HandleEINT2 # 4
        HandleEINT1 # 4
        HandleEINT0 # 4 ; 0xc1(c7)fff84

        當(dāng)發(fā)生中斷時(shí), 芯片自動(dòng)跳轉(zhuǎn)到0x18處執(zhí)行, 0x18處指令為b IsrIRQ,IsrIRQ程序的作用是檢查I_ISPR的各位,判斷是何種中斷發(fā)生,然后根據(jù)中斷的種類(lèi)跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序去執(zhí)行,各種中斷服務(wù)程序的地址定義如下:

        HandleADC # 4
        HandleRTC # 4
        HandleUTXD1 # 4
        HandleUTXD0 # 4
        . . . . . .

        HandleEINT3 # 4

        值得一提的是在44binit代碼中,向量中斷跳轉(zhuǎn)到HandlerEINT0處而非向量中斷跳轉(zhuǎn)到HandleEINT0,程序利用一個(gè)宏將這兩個(gè)標(biāo)號(hào)等同起來(lái),無(wú)論采取向量中斷還是非向量中斷,無(wú)論是跳到HandleEINT0還是HandlerEINT0,得到的效果是一樣的,都是跳到了中斷服務(wù)程序的地址去執(zhí)行。

        另外順便說(shuō)一下飛利浦的LPC系列ARM芯片的中斷的方法,當(dāng)LPC芯片得到中斷信號(hào)后,在中斷初始化時(shí),程序?qū)⒅袛喾?wù)程序的入口地址放到中斷向量地址寄存器中,每個(gè)中斷源有一個(gè)中斷向量地址寄存器和他相對(duì)應(yīng),另外還有一個(gè)叫做VICVectAddr(0xffff0030)的寄存器,當(dāng)發(fā)生中斷時(shí),硬件自動(dòng)判斷該執(zhí)行哪一個(gè)中斷,然后將該中斷源對(duì)應(yīng)的中斷向量地址寄存器中的地址放到寄存器VICVectAddr中。程序中斷向量表里的代碼為跳轉(zhuǎn)到VICVectAddr中的地址執(zhí)行。一旦發(fā)生中斷,自動(dòng)跳轉(zhuǎn)到VICVectAddr中的地址去執(zhí)行,因?yàn)榇藭r(shí)VICVectAddr已經(jīng)被替換成中斷源的中斷服務(wù)程序地址了.

        上述
        HandleADC # 4
        是在數(shù)據(jù)區(qū)中分配4個(gè)字節(jié)的存儲(chǔ)空間, 等同于
        HandleADC FEILD 4
        這四個(gè)字節(jié)的存儲(chǔ)空間中存的是中斷服務(wù)程序的地址. 在C語(yǔ)言編寫(xiě)的main程序中,如何將中斷服務(wù)程序的入口地址放入到這個(gè)存儲(chǔ)空間中呢?細(xì)心的讀者可以發(fā)現(xiàn)這段數(shù)據(jù)區(qū)的起始地址是_ISR_STARTADDRESS, 在MAIN函數(shù)中只要讓
        (*(unsigned *)(_ISR_STARTADDRESS+0x74)) =(int)MyIsr;
        MyIsr是中斷服務(wù)程序的名稱(chēng), 但是_ISR_STARTADDRESS是一個(gè)非定值,這個(gè)值只有在連接器連接的時(shí)候才賦值,在編譯階段他是個(gè)不定值,所以編譯的時(shí)候會(huì)報(bào)錯(cuò)。#define _ISR_STARTADDRESS 成一個(gè)在SDRAM中的地址值。在本例中是0xc7fff00。

        中斷的初始化包括對(duì)INTMSK ,INTCON進(jìn)行初始化,如果是EINT0~7 還需要對(duì)PCONG、EXTINT進(jìn)行初始化,對(duì)
        (*(unsigned *)(_ISR_STARTADDRESS+0x74
        (或者其他偏移量)))賦值. 在中斷服務(wù)程序結(jié)尾要對(duì)I_ISPC寫(xiě)數(shù)清除INTPND。
        如果是EINT0~7還要在寫(xiě)I_ISPC之前對(duì)EXTINTPND寄存器寫(xiě)數(shù)。




        關(guān)鍵詞: ARM向量中斷非向量中

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉