|
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA 中断向量表
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;
b .
b .
ldr pc,=HandlerZDMA0 ;mGB
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
IsrIRQ ;查找中断向量 这是寻找中断源,和跳到中断处理函数中出的处理函数。
sub sp,sp,#4
stmfd sp!,{r8-r9}
ldr r9,=I_ISPR
ldr r9,[r9]
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1
ldr r9,=HandleADC ;irq中断向量表的第一个值
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8]
ldmfd sp!,{r8-r9,pc}
然后定义了这样的语句:
pISR_EINT4567=(int)Eint4567Isr;
下面是中断处理函数使用的__irq关键字
/*************************************************************************
函数功能:中断处理函数
**************************************************************************/
void __irq Eint4567Isr(void)
{
unsigned char flag;
flag=rEXTINTPND;
rI_ISPR=BIT_EINT4567;
rEXTINTPND=0xf;
.......
书上首ARM核对异常的处理过程如下:
(1)当产生异常时, ARM核拷贝CPSR寄存器的内容到SPSR_寄存器中。
上面使用的是中断的非矢量模式,问题是把CPSR寄存器的内容到SPSR_寄存器中是在哪里完成操作的,是要软件实现吗?还是硬件自动实现的?还有,把CPSR寄存器的内容到SPSR_中的_指的是什么?假设是irq异常的话是不是就是irq模式啊?
(2)设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。(这也是硬件自动完成的吗?)
(3) 在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_寄存器中恢复CPSR的值,同时从LR_恢复PC。
|
|