ARM中异常中断处理概述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
异常中断处理概述
1.ARM中异常中断处理概述
1)在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加4个字
节;每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节.整个过程是顺序执行.
2)通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处
执行;
B指令用于执行跳转操作;
BL指令在执行跳转操作的同时,保存子程序的返回地址;
BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;
BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址(R15保存在R14中),根据目标地址的最低位可以将程序状态切换到Thumb状态.
3)当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执
行.在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行.
4)在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程
序退出时,要恢复被中断的程序的执行现场.本章讨论ARM体系中的异常中断机制.
2.ARM体系中异常中断种类.
ARM体系中的异常中断如下表所示:
3.
中断向量表中指定了各异常中断及其处理程序的对应关系.它通常存放在存储地址的低端.在ARM体系中,异常中断向量表的大小为32字节.其中,每个异常中断占据4个字节大小,保留了4个字节空间.
每个异常中断对应的中断向量表的4
.通过这两种指令,程序将跳转到相应的异常中断处理程序处执行.
当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断.在ARM 中通过给各异常中断富裕一定的优先级来实现这种处理次序.当然有些异常中断是不坑能同时发生的,如指令预取中止异常中断和软件中断(SWI)异常中断是有同一条指令的执行触发的,他们是不可能同时发生的.处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式.各异常中断的中断向量地址以及中断的处理优先级如表2所示.
4.异常中断使用的寄存器
各异常中断对应着一定的处理器模式.应用程序通常运行在用户模式下.ARM中的处理器模式如表3所示.
各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如表4所示,其中,R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推.
表4 各处理器模式的物理寄存器组
如果异常中断处理程序中使用它自己的物理寄存器之外的其它寄存器,异常中断处理程序必须保存和恢复这些寄存器.
在表4中各物理寄存器的名称(如R13_svc等)在ARM汇编语言中并没有被预定义.用户使用这些寄存器时,必须使用伪操作RN来定义这些名称.如可以通过下面操作定义寄存器名称R13_svc:
R13_svc RN R13
一.进入和退出异常中断的过程
1.ARM处理器对异常中断的相应过程
ARM处理器对异常中断的响应过程如下:
a.保存处理器当前状态,中断屏蔽位以及各条件标志位.只是通过将当前程序
状态寄存器CPSR的内容保存到将要执行的异常总段对应的SPSR寄存器
中实现的.各异常中断有自己的物理SPSR寄存器.
b.设置当前程序CPSR中相应的位.包括设置CPSR中的位,使处理器进入相
应的执行模式;设置CPSR中的位,禁止IRQ:当进入FIQ模式时,禁止FIQ
中断.
c.将寄存器LR_mode(R14)设置成返回地址,R14从R15中得到PC的备
份.
d.将程序计数器值PC设置成该异常中断的中断向量地址,从而跳转到相应的
异常中断处理程序处执行.
上述的处理器对异常中断的相应过程可以用如下的伪代码描述.
e.响应复位异常中断.
当处理器的复位引脚有效时,处理器中止当前指令.当处理器的复位引脚变
成无效时,处理器开始执行下面的操作.
R14_svc = UNPREDICTABLE value
SPSR_svc = UNPREDICTABLE value
CPSR[4:0] = 0b10011 //进入特权模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0000
Else
PC = 0x00000000
f.响应未定义指令异常中断
处理器相应未定义指令异常中断时的处理过程如下面的伪代码所示.
R14_und = address of next instruction after the undefined instruction
SPSR_und = CPSR
CPSR[4:0] = 0b11011 //进入未定义指令异常中断模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0004
Else
PC = 0x00000004
g.响应SWI异常中断
处理器相应SWI异常中断时的处理过程如下面的伪代码所示.
R14_svc = address of next instruction after the SWI instruction
SPSR_svc = CPSR
CPSR[4:0] = 0b10011 //进入特权模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0008
Else
PC = 0x00000008
h.响应指令预取中止异常中断.
处理器相应指令预取中止异常会总段时的处理过程如下面的伪代码所示.
R14_abt = address of the aborted instruction + 4
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 //进入指令预取中止模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff000c