S3C6410异常处理机制——VIC

来源:互联网 发布:网页语音朗读软件 编辑:程序博客网 时间:2024/05/16 14:17

一.异常处理流程

    按键->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 nextinstruction 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;意味着程序结束,此时再来中断,异常是否响应?

   答:响应。

原创粉丝点击