ARM微处理器的编程模型之:异常中断处理
复位异常中断处理程序将进行一些初始化工作,内容与具体系统相关。下面是复位异常中断处理程序的主要功能。
· 设置异常中断向量表。
· 初始化数据栈和寄存器。
· 初始化存储系统,如系统中的MMU等。
· 初始化关键的I/O设备。
· 使能中断。
· 处理器切换到合适的模式。
· 初始化C变量,跳转到应用程序执行。
2.未定义指令异常
当ARM处理器执行协处理器指令时,它必须等待一个外部协处理器应答后,才能真正执行这条指令。若协处理器没有相应,则发生未定义指令异常。
未定义指令异常可用于在没有物理协处理器的系统上,对协处理器进行软件仿真,或通过软件仿真实现指令集扩展。例如,在一个不包含浮点运算的系统中,CPU遇到浮点运算指令时,将发生未定义指令异常中断,在该未定义指令异常中断的处理程序中可以通过其他指令序列仿真浮点运算指令。
仿真功能可以通过下面步骤实现。
① 将仿真程序入口地址链接到向量表中未定义指令异常中断入口处(0x00000004或0xffff0004),并保存原来的中断处理程序。
② 读取该未定义指令的bits[27∶24],判断其是否是一条协处理器指令。如果bits[27∶24]值为0b1110或0b110x,该指令是一条协处理器指令;否则,由软件仿真实现协处理器功能,可以同过bits[11∶8]来判断要仿真的协处理器功能(类似于SWI异常实现机制)。
③ 如果不仿真该未定义指令,程序跳转到原来的未定义指令异常中断的中断处理程序执行。
当未定义异常发生时,系统执行下列的伪操作。
r14_und = address of next instruction after the undefined instruction
SPSR_und = CPSR
CPSR[4∶0] = 0b11011 /*进入未定义指令模式*/
CPSR[5] = 0 /*处理器进入ARM状态*/
/*CPSR[6]保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0004
Else
PC = 0x00000004
3.软中断SWI
软中断异常发生时,处理器进入特权模式,执行一些特权模式下的操作系统功能。软中断异常发生时,处理器执行下列伪操作。
r14_svc = address of next instruction after the SWI instruction
SPSR_und = CPSR
CPSR[4∶0] = 0b10011 /*进入特权模式*/
CPSR[5] = 0 /*处理器进入ARM状态*/
/*CPSR[6]保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0008
Else
PC = 0x00000008
4.预取指令异常
预取指令异常使由系统存储器报告的。当处理器试图去取一条被标记为预取无效的指令时,发生预取异常。
如果系统中不包含MMU时,指令预取异常中断处理程序只是简单地报告错误并退出。若包含MMU,引起异常的指令的物理地址被存储到内存中。
预取异常发生时,处理器执行下列伪操作。
r14_svc = address of the aborted instruction + 4
SPSR_und = CPSR
CPSR[4∶0] = 0b10111 /*进入特权模式*/
CPSR[5] = 0 /*处理器进入ARM状态*/
/*CPSR[6]保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff000C
Else
PC = 0x0000000C
5.数据访问中止异常
数据访问中止异常是由存储器发出数据中止信号,它由存储器访问指令Load/Store产生。当数据访问指令的目标地址不存在或者该地址不允许当前指令访问时,处理器产生数据访问中止异常。
当数据访问中止异常发生时,处理器执行下列伪操作。
r14_abt = address of the aborted instruction + 8
SPSR_abt = CPSR
CPSR[4∶0] = 0b10111
CPSR[5] = 0
/*CPSR[6]保持不变*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff000C10
Else
PC = 0x00000010
评论