ARM1176JZF-S/S3C6410处理器的异常处理过程
上面的register_list是异常中断处理程序中使用的寄存器列表,标识符^表示要将SPSR_abt寄存器中的值到当前程序状态寄存器CPSR中。
退出数据访问中止异常中断处理(Data Abort)
发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。
数据访问异常中断由当前执行的指令自身产生,当数据访问异常中断发生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置)。此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令后面第2条指令,所以返回操作可以通过下面指令实现:
subs pc, lr, #8
该指令将lr中的值减8后传给程序计数器pc中,实现程序返回,同时将SPSR_abt寄存器内容到当前程序状态寄存器CPSR中;
如果要在数据访问异常中断处理中使用数据栈,可以用以下方法保护、恢复被中断程序的执行现场:
subs lr, lr, #8
stmfd sp!, {register_list, lr} ;保存被中断程序的执行现场;
; . . .
ldmfd sp!, {register_list, pc}^ ;恢复被中断程序的执行现场;
上面的register_list是异常中断处理程序中使用的寄存器列表,标识符^表示要将SPSR_abt寄存器中的值到当前程序状态寄存器CPSR中。
退出IRQ异常中断处理程序(IRQ)
通常处理器执行完当前指令后,查询IRQ中断引脚,并查看是否允许IRQ中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断,当IRQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当IRQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_irq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:
subs pc, lr, #4
该指令将lr中的值减4后传给程序计数器pc中,实现程序返回,同时将SPSR_irq寄存器的内容到当前程序状态寄存器CPSR中。
如果要在IRQ异常中断处理中使用数据栈,可以用以下方法保护、恢复被中断程序的执行现场:
subs lr, lr, #4
stmfd sp!, {register_list, lr} ;保存被中断程序的执行现场
; . . .
ldmfd sp!, {register_list, pc}^ ;恢复被中断程序的执行现场
上面的register_list是异常中断处理程序中使用的寄存器列表,标识符^表示要将SPSR_irq寄存器中的值到当前程序状态寄存器CPSR中。
退出FIQ异常中断处理程序(FIQ)
与IRQ异常中断一样,处理器执行完当前指令后,查询FIQ中断引脚,并查看是否允许FIQ中断,如果中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ异常中断,当FIQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当FIQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_fiq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:
subs pc, lr, #4
该指令将lr中的值减4后传给程序计数器pc中,实现程序返回,同时将SPSR_fiq寄存器的内容到当前程序状态寄存器CPSR中。
如果要在FIQ异常中断处理中使用数据栈,可以用以下方法保护、恢复被中断程序的执行现场:
subs lr, lr, #4
stmfd sp!, {register_list, lr} ;保存被中断程序的执行现场
; . . .
ldmfd sp!, {register_list, pc}^ ;恢复被中断程序的执行现场
上面的register_list是异常中断处理程序中使用的寄存器列表,标识符^表示要将SPSR_fiq寄存器中的值到当前程序状态寄存器CPSR中。
补充:关于程序返回地址(PC)的取值
上文中提到,在进入异常处理之后,CPU会自动根据pc的值来设置lr的值(一般是减4),而对于不同各类的异常来说,这个值还不能直接用做异常的返回地址,可能还需要再减4或减8等等,这样做的原因是什么呢?
答案在于ARM处理器在处理指令时所使用的三级流水线机制。
CPU执行一条指令的过程可以分为三个步骤:取指令、翻译和执行。执行每一个步骤都需要一个指令周期的时间,所以完整地执行完一条指令实际上就需要3个周期。为了加快程序的运行,现代CPU都会采用多级流程线的技术。以三级流水线为例,一条专门负责取指,一条专门翻译,还有一条负责执行,三条流水线并行工作,每一条流水线在每
ARM1176JZF-SS3C6410处理器异常处 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)