中断是异常的一种,是计算机系统中处理异步事件的重要机制
以按键触发中断为例
1)中断的触发
a)中断源级设置
触发模式的设置,中断使能
b)中断控制器级设置
中断优先级,中断使能,报告给哪个ARM核,以IRQ/FIQ形式上报
c)arm内核设置
中断使能
2)中断的响应过程
a)硬件自动做4件事
1、备份CPSR
SPSR_<mode>=CPSR
2、修改CPSR
mode
T = 0//切换为ARM工作状态
F = 1 //屏蔽FIQ异常
I =1 //屏蔽IRQ异常
3、保存返回地址到LR_<mode>
PC=vec_base + 0x18
b)跳转到异常向量表对应位置执行
ldr pc, _irq
c)继续跳转到真正的IRQ异常处理程序
asm_do_irq:
保护现场
bl c_do_irq
恢复现场
c_do_irq:
判断是哪个硬件触发的中断
调用对应的硬件中断处理函数hardware_isr
hardware_isr:
控制硬件(特殊功能寄存器)
清除中断源,中断控制器级的pending位
为什么ARM中FIQ比IRQ能够得到更快的响应?
1)FIQ比IRQ的优先级高
2)通过观察异常向量表可以看出,FIQ的异常处理代码可以直接放在异常向量表中,不需要跳转,可以比IRQ少一条跳转指令
3)保护现场时,FIQ异常比IRQ异常可以少压栈r8-r12寄存器,也可以使对应的硬件处理hardware_isr更快的被执行到