首先ARM芯片要进行中断设置要使能中断向量,然后当有IRQ中断来之后,CPU自动的到0x18地址处取指。0x18处的指令呢是CPU根据中断源算好的(比如:中断EINT4567来了,那么0x18处的指令就是跳转到地址0x30处)。然后就执行“ldr pc,=HandlerEINT4567”这条指令。这条指令的执行结果就是跳转到 “HandlerEINT4567 HANDLER HandleEINT4567”处执行。这条是宏指令,你可以看一下宏定义。执行结果就是跳转到HandleEINT4567处执行。
那么HandleEINT4567处又是什么指令呢?这就要联系44b.h文件的#define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0x74))定义看了。HandleEINT4567处的地址就是“_ISR_STARTADDRESS+ 0x74”。到此还不知道这个地址对应的指令是什么。
这时候就要去看Target.c文件的中断初始化了,其中pISR_EINT4567= (unsigned) OSEINT4567ISR;这条语句就解释了中断去向何处。 OSEINT4567ISR就是在OS_CPU_A.s里面定义的中断处理程序了。
一、 关于44B0中断系统。
44B0中断系统中有两张中断转移表,经过二重转移才跳到中断处理程序。第一张中断向量表由硬件决定,所在区域为ROM(flash),地址空间从 0X00开始,其中0X00-0X1C为异常向量入口地址,0X20-0XC0为中断向量入口地址。另一张中断向量表在RAM中,可以随便改,其位置在程序连接后才定。
二、 如何从第一张中断向量表跳到第二张中断向量表。
由于RAM放在地址空间的高端(距离中断向量超过了32M),故在第一张中断向量表对应位置上写上
ldr PC,# interrupt_service
如:ldr PC,=HandlerEINT4567
三、如何在启动程序中设置异常向量,中断向量表。如何把C语言中的一个中断函数对应到汇编的中断向量表中,示意图及举例如下:
#define _ISR_STARTADDRESS 0xc7fff00 //GCS6:16M bit DRAM/SDRAM
#define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0x74))
.macro HANDLER HandleLabel
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0,=HandleLabel
ldr r0, [r0]
str r0, [sp,# 4]
ldmfd sp!, {r0,pc}
.endm
.text
ENTRY:
b ResetHandler ……
VECTOR_BRANCH:
ldr pc,=HandlerEINT0 ……
ldr pc,=HandlerEINT4567 /* 0x30 */
HandlerEINT4567:HANDLER HandleEINT4567
.equ HandleEINT4567, _ISR_STARTADDRESS+4*29
把C语言中的一个中断函数对应到汇编的中断向量表中
pISR_EINT4567 = (int)Eint4567Isr;
其实异常向量就是中断向量,ARM7的内核实际上只有8个(1个保留)异常向量,对于众多的中断源,ARM7的内核是通过IRQ、FRQ的软件查询中断状态寄存器的位来获得ISR的起始地址。而44B0为了克服这种方式所带来的中断延迟,就加入了更多的中断向量表(0x20到0xc0),要使用这种方式,必须在中断控制寄存器中设置每个中断源的方式为IRQ方式,且使用向量中断。
