您的位置 首页 ADAS

ARM 向量中止和非向量中止

44B0的向量中断响应过程是中断发生后芯片会自动跳转到0x00000018处执行指令ENTRYbResetHandler;0x00bHandlerUndef;0x04bHand…

44B0的向量中止呼应进程是中止产生后芯片会主动跳转到0x00000018处履行指令

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

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

依据44b0的DATASEET,0x18处放置的指令为b HandlerIRQ; 当程序跳转到这儿履行时, 芯片在这个地址取到的代码现已被后边程序中的branch instructions替代了,举个比如,假如芯片EINT3产生中止,芯片会跳转到0x18处履行,先在0x18处取指,这时取到的指令现已不是b HandlerIRQ,b HandlerIRQ现已被芯片主动替换成了ldr pc,=HandlerEINT3,然后芯片再履行此条指令。

非向量中止的代码如下:

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

当产生中止时, 芯片主动跳转到0x18处履行, 0x18处指令为b IsrIRQ,IsrIRQ程序的作用是查看I_ISPR的各位,判别是何种中止产生,然后依据中止的品种跳转到相应的中止服务程序去履行,各种中止服务程序的地址界说如下:

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

HandleEINT3 # 4

值得一提的是在44binit代码中,向量中止跳转到HandlerEINT0处而非向量中止跳转到HandleEINT0,程序使用一个宏将这两个标号同等起来,不管采纳向量中止还对错向量中止,不管是跳到HandleEINT0仍是HandlerEINT0,得到的作用是相同的,都是跳到了中止服务程序的地址去履行。

别的趁便说一下飞利浦的LPC系列ARM芯片的中止的办法,当LPC芯片得到中止信号后,在中止初始化时,程序将中止服务程序的进口地址放到中止向量地址寄存器中,每个中止源有一个中止向量地址寄存器和他相对应,别的还有一个叫做VICVectAddr(0xffff0030)的寄存器,当产生中止时,硬件主动判别该履行哪一个中止,然后将该中止源对应的中止向量地址寄存器中的地址放到寄存器VICVectAddr中。程序中止向量表里的代码为跳转到VICVectAddr中的地址履行。一旦产生中止,主动跳转到VICVectAddr中的地址去履行,由于此刻VICVectAddr现已被替换成中止源的中止服务程序地址了.

上述
HandleADC # 4
是在数据区中分配4个字节的存储空间, 同等于
HandleADC FEILD 4
这四个字节的存储空间中存的是中止服务程序的地址. 在C言语编写的main程序中,如何将中止服务程序的进口地址放入到这个存储空间中呢?仔细的读者能够发现这段数据区的开始地址是_ISR_STARTADDRESS, 在MAIN函数中只要让
(*(unsigned *)(_ISR_STARTADDRESS+0x74)) =(int)MyIsr;
MyIsr是中止服务程序的称号, 可是_ISR_STARTADDRESS是一个非定值,这个值只要在衔接器衔接的时分才赋值,在编译阶段他是个不定值,所以编译的时分会报错。#define _ISR_STARTADDRESS 成一个在SDRAM中的地址值。在本例中是0xc7fff00。

中止的初始化包含对INTMSK ,INTCON进行初始化,假如是EINT0~7 还需要对PCONG、EXTINT进行初始化,对
(*(unsigned *)(_ISR_STARTADDRESS+0x74
(或许其他偏移量)))赋值. 在中止服务程序结束要对I_ISPC写数铲除INTPND。
假如是EINT0~7还要在写I_ISPC之前对EXTINTPND寄存器写数。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/262708.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部