一.异常处理流程:
按键->GPIO->VIC(ISR)->ARM1176
二.流程图:
开始 -> 1.操作CP15协处理器VE[24]——VIC PORT;2.CPSR程序状态寄存器I[7]——IRQ开关;3.配置IRQ栈,CPSR M[4:0];4.切换到SVC模式;5.main ->
main:1.GPIO初始化;2.VIC初始化;3.ISR入口地址传给VICXVECADDR寄存器 -> ISR(异常处理例程):1.sub lr,lr,#4 IRQ模式下(R14_mon = address of the next instruction to be executed + 4);2.stmfd sp!,{r0-r12,lr} 保存寄存器状态;3.处理异常事件;4.ldmfd sp!,{r0-r12,pc}^ SPSR保存的寄存器状态给CPSR
三.问题:
1.为什么程序要在SVC模式执行寄存器初始化、异常处理等工作?而不是在IRQ模式下?
答:IRQ模式下CPSR第7位IRQ开关关断,即中断不可重入,此时再来中断,程序无法响应。
2.按键,我们设置GPNCON为input模式,可通过GPNDAT数据来判断哪个按键按下;GPNCON设置为Ext.interrupt模式时,要通过EINT0PEND来判断哪个按键按下,可不可以通过GPNDAT来判 断?
答:可以的。只不过每次按键松开时,都要清空GPNDAT数据。
3.
int main()
{
init_gpio();
init_vic(vic_interrupt);
return 0;
}
vic_interrupt为异常处理函数入口地址,倘若没有发生异常,程序是不是也要进入到ISR中?
答:当然不是,把ISR入口地址传给了init_vic函数,并不意味着函数一定要执行ISR函数,只是给了它ISR的地址,一旦有异常,随即进入ISR中
4.上述程序,return 0;意味着程序结束,此时再来中断,异常是否响应?
答:响应。