先厘清概念
异常:异常就是在程序运行过程中(USER mode),出现了一些异常情况,而中断是异常的一种情况。
中断:中断是一种异常。
异常发生了会进入相应的模式。
ARM体系的CPU有7种工作模式:
- User(用户模式) : ARM处理器正常的程序执行状态
- FIQ(快速中断模式) : 当一个高优先级(fast) 中断产生时将会进入这种模式
- IRQ(中断模式) : 通常的中断产生时将会进入这种模式
- Svc(管理模式) : 当复位或软中断指令执行时将会进入这种模式
- Abt(中止模式) : 当数据或指令预取中止时将会进入这种模式
- Und(未定义指令模式) : 当执行未定义指令时会进入这种模式
- Sys(系统模式) : 使用和User模式相同寄存器集的特权模式,运行具有特权的操作系统任务
再看一下ARM在各模式下的寄存器
ARM一共有37个32位寄存器。其中31个通用寄存器和6个状态寄存器。
图中带三角的寄存器在物理上是不同的寄存器。例如,R8_fiq和R8就属于不同的物理寄存器。
再重点看一下程序状态寄存器:
ARM对异常(中断)处理过程
1 初始化:
a 设置中断源,让它可以产生中断
b 设置中断控制器(可以屏蔽某个中断,优先级)
c 设置CPU总开关,(使能中断)
2 执行其他程序:正常程序
3 产生中断:按下按键—>中断控制器—>CPU
4 cpu每执行完一条指令都会检查有无中断/异常产生
5 发现有中断/异常产生,开始处理。对于不同的异常,跳去不同的地址执行程序。这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。如下就是异常向量表。
(3-5都是硬件强制做的)
6 这些函数做什么事情?
软件做的:
a 保存现场(各种寄存器)
b 处理异常(中断):
分辨中断源
再调用不同的处理