ARM的异常响应过程

其他内容不再赘述,现在粘贴三张需要的表


表1                异常类型,优先级及向量地址

异常类型优先级工作模式异常向量地址说明
复位 RESET1管理模式0x00000000当RESET引脚有效时进入该异常
未定义的指令 UND6未定义指令的终止模式0x00000004协处理器认为当前指令未定义时产生指令异常。可利用它模拟协处理器操作

软件中断 SWI

6管理模式0x00000008用户定义的中断指令,可用于用户模式下的程序调用特权操作
指令预取中止 PABT5中止模式0x0000000C当预取指令地址不存在或该地址不允许当前指令访问时,执行指令产生的异常
数据访问中止 DABT2中止模式0x00000010当数据访问指令的目标地址不存在或该地址不允许当前指令访问时,执行指令产生异常
外部中断请求 IRQ4外部中断模式0x00000018有外部中断时发生得异常
快速中断请求 FIQ3快速中断模式0x0000001C有快速中断请求时发生得异常

 

表2                           ARM状态下的寄存器组织(Thumb下是其一部分,就不列了)

寄存器\模式用户模式系统模式管理模式中止模式未定义模式外部中断模式快速中断模式

通用寄存器

--

共31个

-R0-R7,8个

-R8~R12,分两组共10个

-R13~R14除了SP(堆栈指针)和LR(程序链接寄存器),其他模式下均有特定标记,分6组共12个

-(R15)PC,1个

8+10+12+1=31个

 

注:通用寄存器都是32位,并不是其中的某几位

R0
R1
R2
R3
R4
R5
R6
R7
R8R8_fiq
R9R9_fiq
R10R10_fiq
R11R11_fiq
R12R12_fiq
R13(SP)R13_svcR13_abtR13_undR13_irqR13_fiq
R14(LR)R14_svcR14_abtR14_undR14_irqR14_fiq
程序计数器R15(PC)
状态寄存器CPSR
SPSR_svcSPSR_abtSPSR_undSPSR_irqSPSR_fiq

Thumb状态下的寄存器组织

Thumb状态下的寄存器组是ARM状态下的子集,高位寄存器R8~R12在Thumb状态

下不可见,在Thumb-2下可使用

 

表3                          当前程序状态寄存器CPSR - 1个,备份程序寄存器SPSR_mode(svc,irq,und,fiq,abt)-5个

NZCVQ````````````````````IFTM4M3M2M1M0
313029282726···················状态保留······················876543210

N~Q为条件码,不做赘述

............................

控制位含义如下:

I       为中断禁止控制位,I=1禁止外部IRQ中断,I=0允许IRQ中断。

F      为禁止快速中断FIQ的控制位,F=1禁止,F=0允许。

T      为ARM与Thumb指令切换,T=1执行Thumb指令,T=0执行ARM指令。若不具备Thumb指令的处理器,T=1时表示强制下一条执行的指令产生未定义的指令中断。

M4~M0为模式选择位,决定处理器处于何种模式,具体见表1

表4                                ARM处理器工作模式

工作模式功能说明CPSR[M4:M0]
用户模式 User程序正常执行工作模式10000
快速中断模式 FIQ处理高速中断,用于高速数据传输或通道处理10001
外部中断模式 IRQ用于普通中断处理10010
管理模式 SVC操作系统的保护模式,处理软中断SWI10011
中止模式 ABT处理存储器故障,实现虚拟存储器和存储器保护10111
未定义指令模式 UND处理未定义的指令陷阱,用于支持硬件协处理器仿真11011
系统模式 SYS运行特权级的操作系统任务11111

eg:对于CPSR寄存器,选择用户模式且使用快速中断FIQ,禁止IRQ中断,Thumb状态,则CPSR的值为:0x000000B0.

 

嗯,看完这些,就可以描述ARM异常中断的响应过程和异常处理程序的返回过程了

一:ARM异常的中断响应过程

除了复位异常立即中止当前指令外,其他情况都是处理器完成当前指令才去执行异常处理程序。

1.保存CPSR(当前程序状态寄存器)的值到将要执行异常中断对应的SPSR(备份程序寄存器)。

--SPSR有五组,分别是svc,irq,und,fiq,abt

2.设置当前状态寄存器CPSR的值

设置CPSR的M0-M4的5个位,进入相应工作模式。同时也可以设置F,I,T来禁止允许相应中断,例:设置I=0禁止IRQ中断;设置F=1进入复位模式或者FIQ模式以禁止FIQ中断。

3.将引起异常指令的下一条地址(断点地址)保存到新的异常工作模式的LR(R14_mode,程序链接寄存器)中,使得异常处理程序执行完后能正确返回原来的程序处继续执行。

例如异常中断发生,R13_mode存放堆栈指针,R14_mode存放断点地址。

4.给程序计数器PC强制赋值,转入表1所示的向量地址,以便执行相应的处理程序。

 

二:从异常处理程序中返回

复位异常发生后,从0x00000000开始重新执行程序,无需返回。其余异常处理完成后必须回到原来程序处执行。

1.将SPSR_mode寄存器的值复制到CPSR中,使得CPSR恢复到原先状态。

1.根据异常类型将PC值恢复成断点地址,以继续执行用户原来运行着的程序。

2.清除CPSR的中断禁止标志I和F,开放外部中断IRQ和快速中断FIQ。

程序状态字和断点地址的恢复是同时进行的,先恢复一方会产生错误。

先恢复CPSR,则保存断点地址的R14_mode不能访问。

先恢复断点地址,则异常处理程序失去对指令的控制,以至于CPSR不能恢复。

 

在应用程序的设计中,首先要进行异常向量的初始化处理,采用的方法是在异常向量表的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应得异常向量,从而跳转到异常处理程序,当异常处理完成以后返回到主程序继续执行。

 

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值