- 论坛徽章:
- 0
|
1.几个概念 0x0 - 0x1c 叫异常向量表
0x20 - 0xc0 叫中断向量表
RAM区用户定义中断向量表,叫二级中断向量表
2.向量模式中断
异常向量表后紧接中断向量表,没有二级中断向量表,中断向量表里放的是中断服务程序的入口地址.
从0x18到中断向量表的跳转是由硬件自行完成的.
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
3.非向量模式中断:
这个比较复杂,
原理: irq request -> 0x18 -> HandlerIRQ(一个宏) -> HandleIRQ(一个内存地址,里面是IsrIRQ函数的地址) -> IsrIRQ(根据I_ISPR,来判断哪个中断发生) -> 二级中断向量表(RAM高端) -> 转到中断服务程序的入口地址(此图根据44b0init.s得来,不是下面的代码的运行方式)
如下图:
file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot.jpg
file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot-1.jpg
![]()
此处代码比上图的运行方式少了一个环节:没有HandlerIRQ这个阶段.
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
0 movs r9,r9,lsr #1 ;移位,c为最后一位被移出的.如果最后一位是1,那么C置位,
bcs %F1 ;如果C置位,跳.
add r8,r8,#4
b %B0
1 ldr 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
中断寄存器
---------------------------------------------------------
INTCON 0x01e00000 Interrupt Control
INTPND 0x01e00004 Interrupt Request Status
INTMOD 0x01e00008 Interrupt Mode Control
INTMSK 0x01e0000c Interrupt Mask Control
I_PSLV 0x01e00010 IRQ Interrupt Previous Slave
I_PMST 0x01e00014 IRQ Interrupt Priority Master
I_CSLV 0x01e00018 IRQ Interrupt Current Slave
I_CMST 0x01e0001c IRQ Interrupt Current Master
I_ISPR 0x01e00020 IRQ Interrupt Pending Status
I_ISPC 0x01e00024 IRQ Interrupt Pending Clear
F_ISPR 0x01e00038 FIQ Interrupt Pending
F_ISPC 0x01e0003c FIQ Interrupt Pending Clear
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26390/showart_722909.html |
|