ARM的异常处理

经典ARM微处理器包括7种异常:

1、 复位异常

2、 未定义指令异常

3、 软件中断异常

4、 预取指令异常

5、 数据异常

6、 IRQ(中断)

7、 FIQ(快速中断)

异常,单片机为中断,笼统来讲可以把异常类似的看作中断,本质上两者还是有区别的。异常/中断是硬件和软件进行异步工作的一种方式。

经典ARM微处理器发生异常时,ARM微处理器会自动调用预先写好的异常处理程序。为了让ARM核能自动的调用异常处理程序,必须规定一个位置,存放异常处理程序入口。ARM微处理器设计者把7种异常的入口放到一起,称为异常向量表,每种异常在异常向量表种占4个字节。如下图所示:

图:ARM异常向量表

异常向量表占32个字节,其中有一个预留的(0x14),ARM异常向量表地址默认在地址0,有些处理器可以设置为0xFFFF0000地址处,具体要看CPU手册。由于每个异常入口在向量表中只有4个字节,所以在异常向量表中每种异常都只放一条ARM跳转指令(发生异常后,处理器自动切换到ARM状体),跳转到对应的异常处理程序处继续执行。

当异常发生时,硬件自动做如下动作:

图:ARM异常发生时硬件做哪些工作

看到这里我们回想一个问题:

1、 为什么ARM微处理器用户和系统模式没有SPSR寄存器,而其他5种异常模式却有SPSR寄存器?

异常发生后,ARM微处理器会自动进入到ARM状体,并且自动切换到异常对应的模式运行。这就需要修改CPSR寄存器(T位,Mode位),我们都知道,当异常处理程序执行完毕后我们需要恢复“现场”,即将相关寄存器恢复到异常发生前的值,以保证之前的代码依然能够正确执行。同样,CPSR也需要恢复到异常发生前的值,所以硬件在修改CPSR之前需要先保存其值,ARM就为每种异常模式设计了一个SPSR寄存器,用于异常发生时保存CPSR寄存器的值,保证异常处理完毕能恢复其值。

同理,用户和系统模式只能通过指令主动切换到该模式,不会由硬件通过异常自动进入,也就不需要硬件备份CPSR寄存器的值,所以没必要设计一个SPSR寄存器。

2、为什么每种异常模式都有一个物理上独立的R14/LR寄存器?

异常发生后,ARM微处理器会自动跳转到异常入口(向量)处执行代码,当异常处理完毕,需要返回到之前发生异常的地方继续执行代码,如何知道之前在哪个地址执行代码呢?

异常发生时,在跳转到异常入口前,需要保存PC寄存器的值,PC是取指的地址,也就间接的代表着执行位置,为了在硬件修改PC前保存PC,所以设计者为每种异常模式设计了一个物理上独立的R14/LR寄存器,用于保存返回地址。

异常返回:

异常发生时,ARM微处理器会自动做些保护现场的工作,但是返回时完全靠软件来处理。

ARM异常处理完毕,软件需要做:

1、 恢复CPSR寄存器的值

2、 根据R14/LR寄存器恢复PC的值

异常向量表能放哪些指令?

图:异常向量表中可以放哪些ARM指令

如上图,异常向量表中通常存放一条ARM跳转指令。放不同的指令,有不同的限制。比如使用mov指令,异常程序地址必须以8位图立即数的形式给出,这样异常处理程序地址必须固定;使用B指令只能相对跳转32M Bytes的范围内;使用LDR加载指令时,其偏移量只能使用立即数的形式,加载范围是4K字节。放那种指令需要根据自己系统需要。

异常发生后到异常处理程序返回的大致流程:

图:ARM异常处理流程示例

异常优先级:

图:ARM异常优先级

ARM中断:

ARM有两种中断,FIQ快速中断,IRQ中断,FIQ优先级高于IRQ。ARM微处理器有两个中断触发脚,对应的脚上是低电平时,触发相应的中断,如果ARM核没有关闭该中断,则处理器响应该中断,执行对应的中断处理程序。

图:ARM中断框图

FIQ vs IRQ:

图:FIQ vs IRQ

ARM异常处理程序返回指令:

图:ARM异常返回指令参考

  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值