赞
踩
经典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异常返回指令参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。