异常的概念:
处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序。
异常处理机制:
不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同,比如:
处理器遇到哪些事件认为是异常事件
遇到异常事件之后处理器有哪些动作
处理器如何跳转到异常处理程序、该怎么去处理异常
处理完异常之后又如何返回到被打断的程序继续执行
等我们将这些细节的实现称为处理器的异常处理机制
导致异常产生的事件称为异常源
ARM有七类异常源
FIQ 快速中断请求引脚有效
IRQ 外部中断请求引脚有效
Reset 复位电平有效
Software Interrupt 执行swi指令
Data Abort 数据终止
Prefetch Abort 指令预取终止
Undefined Instruction 遇到不能处理的指令
FIQ、IRQ 是由外部硬件产生的,比如网卡数据包到达了就会产生一个中断,FIQ>IRQ优先级
前3个都是由硬件产生的,。
数据终止:比如CPU去访问内存数据,地址不正确或者地址无法访问
内存中既有指令又有数据,从内存中去指令时发生错误
异常模式:
在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式
FIQ:FIQ
IRQ:IRQ
SVC:Reset、Software Interrupt
Abort:Data Abort、Prefetch Abort
Undef:Undefined Instruction
ARM产生异常后的动作(自动完成)
1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>,异常处理完后要回到前面的模式和状态(正常模式没有SPSR_mode)
2.修改CPSR的值
2.1.修改中断禁止位禁止相应的中断,同一个类型的中断同时只能处理一个,但是FIQ可以打断IRQ,优先级高,也就是相同的中断不能打断,如果是IRQ位,那么禁止IRQ,如果是FIQ,IRQ和FIQ都禁止
2.2.修改模式位进入相应的异常模式 产生异常
2.3.修改状态位进入ARM状态,不管是ARM指令还是Thumb指令,遇到异常都会切换到ARM指令状态
3.保存返回地址到对应异常模式下的LR_<mode>,要不然异常处理完了不知道回到哪个地址了
4.设置PC为相应的异常向量(异常向量表对应的地址),开始执行异常处理程序,前面的都是准备
上面自动跳转东安,异常处理程序使我们自己写的,
既然知道了固定的地址,能不能直接把异常处理程序写在那呢?
不行。只有4个字节,而异常处理程序远远超过4个字节,就会导致把后面的异常向量覆盖了,整个内核就G了,混乱,就直接卡死了。
异常向量表中放跳转指令
异常优先级
多个异常同时产生时的服务顺序
Reset
Data Abort
FIQ
IRQ
Prefetch Abort
Software Interrupt
Undefined instruction
FIQ的响应速度比IRQ快
1. FIQ在异常向量表位于最末
可直接把异常处理写在异常向量表之后,省去跳转
2. FIQ模式有5个私有寄存器(R8-R12)
执行中断处理程序前无需压栈保存寄存器,可直接处理中断(无需把用户模式的压栈,FIQ使用自己特有的寄存器,不是使用用户模式的)
3. FIQ的优先级高于IRQ
3.1 两个中断同时发生时先响应FIQ
3.2 FIQ可以打断RIQ,但RIQ不能打断FIQ
IRQ在驱动开发中常用,其它的大多还是CPU内核使用。