- Handling Processor Exception
Exception
|
Description
|
Reset
|
复位中断,中断向量在
0x0000
处
|
Undefined Instruction
|
un-recognized executing instruction
|
Software Interrupt(SWI)
|
用户中断,提供了在用户模式下请求执行监控模式功能的方法,例如调用
RTOS function
|
Prefetch Abort
|
用于地址非法,导致了处理器不能执行取址
|
Data Abort
|
到数据传输时,
load
或
store
地址非法
|
IRQ
|
外部中断发生(低电平有效)
|
FIQ
|
Fast Interrupt Requset
发生(低电平有效)
|
通常情况下,应用运行于用户模式,但是异常处理需要运行于特权模式(即非用户模式),异常模式能够访问如下寄存器:
该模式下的r13或Stack Pointer(sp_mode)
该模式下的r14或Link Register(lr_mode)
该模式下的Saved Program Status Register(spsr_mode)
在FIQ模式下,还能够方位r8_FIQ-r12_FIQ。
- 中断优先级
Vector address
|
Exception type
|
Exception mode
|
Priority(1=H, 6=Low)
|
0x0
|
Reset
|
Supervisor(SVC)
|
1
|
0x4
|
Undefined Instruction
|
Undef
|
6
|
0x8
|
Software Interrupt(SWI)
|
Supervisor(SVC)
|
6
|
0xC
|
Prefetch Abort
|
Abort
|
5
|
0x10
|
Data Abort
|
Abort
|
2
|
0x14
|
Reserved
|
Not application
|
Not application
|
0x18
|
Interrupt(IRQ)
|
Interrupt(IRQ)
|
4
|
0x1C
|
Fast Interrupt(FIQ)
|
Fast Interrupt(FIQ)
|
3
|
- 进入异常处理
将CPSR拷贝到SPSR,在SPSR中保存the current mode,interrupt mask及condition flags。改变CPSR到合适的模式,map in the appropriate banked register for that mode。其它异常发生时,屏蔽IRQ;在FIQ和reset发生时,屏蔽FIQ。将中断返回地址存入到lr_mode。将PC指向中断向量表中指定的地址。
- 基本概念
ARM:Advanced RISC Machines
RISC:Reduced Instruction Set Computer(精简指令集)
ARM支持7种处理器模式,正常情况下,程序在用户模式下执行,当软件异常或硬件中断发生时,进入相应的处理器模式。
处理器模式
|
说明
|
Visible Thumb state registers
|
Visible ARM state registers
|
User
用户
|
正常程序执行模式
|
R7..R0, LR, SP, PC, CPSR
|
R14..R0, PC, CPSR
|
FIQ
|
支持高速数据传送或通道处理
|
R7..R0
,
LR_fiq, SP_fiq,
PC, CPSR, SPSR_fiq
|
R7..R0, R14_fiq..R8_fiq,
PC, CPSR, SPSR_fiq
|
IRQ
|
通用中断处理
|
R7..R0
,
LR_irq, SP_irq,
PC, CPSR, SPSR_irq
|
R12..R0
,
R14_irq, R13_irq, PC, CPSR, SPSR_irq
|
Supervisor(svc)
|
操作系统保护模式
|
R7..R0
,
LR_svc, SP_svc, PC,
CPSR, SPSR_svc
|
R12..R0, R14_svc,R13_svc
PC, CPSR, SPSR_svc
|
Abort
|
实现虚拟存储
/
存储器保护
|
R7..R0
,
LR_abt, SP_abt, PC,
CPSR, SPSR_abt
|
R12..R0
,
R14_abt, R13_abt, PC, CPSR, SPSR_abt
|
Undefined
|
支持硬件辅助计算器的软件仿真
|
R7..R0
,
LR_und, SP_und,
PC, CPSR, SPSR_und
|
R12..R0
,
R14_und, R13_und, PC, CPSR
|
System
|
执行操作系统工作
|
R7..R0
,
LR, SP, PC, CPSR
|
R14..R0, PC, CPSR
|
通常情况下,程序执行于用户模式,如果发生外部中断IRQ,就进入IRQ处理器模式,这时使用分组寄存器r13_irq和r14_irq,而不是使用r13和r14。R15是程序计数器PC,它指向正在取指的指令而不是正在执行的指令。由于ARM7中的三条流水线,读取的PC指针,总是比当前执行的汇编代码的地址多8。
mov pc, pc
这条指令将使程序跳转到当前指令的下下条指令(即跳过一条指令)执行程序。
sub, pc, pc, #4
执行的是下一条指令
sub, pc, pc, #8
则是一条死循环
R14:当执行带链接分支的指令BL时,得到R15的副本
R13:作为堆栈指针(SP),通常在BOOT程序里把R13初始化为指向异常模式分配的堆栈。
对未定义模式堆栈进行初始化
UNDEFMODE DEFINE 0x1b(00011011)
MODEMASK DEFINE 0x1f(00001111)
NOINT DEFINE 0xc0(11000000)
mrs r0, cpsr
bic r0, r0, #MODEMASK ;
把
cpsr
的低
4
位清零
orr r1, r0, #UNDEFMODE | NOINT
msr cpsr_cxsf, r1
ldr sp, =UndefStack ;
把堆栈的位置送给
SP
|
ARM处理器支持程序状态寄存器存取指令,用于程序状态寄存器和通用寄存器之间交换内容。
MRS:程序状态寄存器到通用寄存器的数据传递指令
MSR:通用寄存器到程序状态寄存器的数据传递指令
由于
ARM
用
r14
来保存子程序的返回地址而不需要调用堆栈获得,故
ARM
的子程序调用很快。