ARM异常中断处理流程
中断与异常
CPU 在运行的过程中,也会被各种“异常”打断。这些“异常”有:
- 指令未定义。
- 指令、数据访问有问题。
- SWI(软中断)。
- 快中断。
- 中断。
中断也属于一种“异常”,导致中断发生的情况有很多,比如:
⚫ 按键
⚫ 定时器
⚫ ADC 转换完成
⚫ UART 发送完数据、收到数据
⚫ 等等
这些众多的“中断源”,汇集到“中断控制器”,由“中断控制器”选择优先
级最高的中断并通知 CPU。
“通过SWI异常,用户模式的应用程序可以调用系统模式下的代码”–《ARM体系结构与编程》。在Linux中,通过SWI异常为应用程序提供系统调用,从而使应用程序从用户态进入内核态。
中断的处理流程
arm 对异常(中断)处理过程:
- 初始化:
a) 设置中断源,让它可以产生中断
b) 设置中断控制器(可以屏蔽某个中断,优先级)
c) 设置 CPU总开关(使能中断) - 执行其他程序:正常程序
- 产生中断:比如按下按键—>中断控制器—>CPU CPU
- 每执行完一条指令都会检查有无中断/异常产生
- CPU 发现有中断/异常产生,开始处理。 对于不同的异常,跳去不同的地址执行程序。在跳转到对应异常向量地址之前还有:
(1)保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的,各异常中断有自己的物理SPSR寄存器。
(2)设置CPSR中相应的位。包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位 ,禁止IRQ中断,当进入FIQ模式时,禁止FIQ中断。
(3)将寄存器lr_mode(相应模式的LR寄存器)设置成返回地址。
(4)将PC寄存器设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。 - 这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向 量。③④⑤都是硬件做的。
这些函数做什么事情?
软件做的:
a) 保存现场(各种寄存器)
b) 处理异常(中断):分辨中断源,再调用不同的处理函数
c) 恢复现场
在中断处理、函数调用和进程切换中,保存现场即为将CPU寄存器的值入栈,用栈来保存现场、恢复现场。