对于M4/3处理器编译程序的时候就把异常向量表设置好烧写在flash上,cpu执行程序时每执行完一条指令,就会判断有没有中断产生。如果有中断产生,就会终止下一条指令,跳过去执行处理异常和中断,首先保存现场,把当前程序所涉及的寄存器保存在栈中,由硬件来实现的,使用异常和中断 在向量表找到一项,跳去执行函数,返回触发恢复现场。
对于A7发生中断,硬件上决定切换模式IRQ,跳转执行相关模式代码。软件上保存现场,保存在栈中,分配中断源然后处理最后恢复现场。
不同:
对于M4/3处理器首先向量表对于每个异常都放有处理函数,而对于A7呢,对于对于某一类异常在向量表放一个总入口里面放一个跳转指令。当发生中断时,M3/4硬件上帮你做了很多事,保存现场,分辨中断源,帮你去向量表去执行对应函数,即使恢复现场,也是软件触发,硬件执行恢复,软件只要提供处理函数就行。
而对于A7硬件只切换cpu模式,只帮你跳转执行异常向量表中某条指令,剩下的保存现场,分辨中断源,恢复现场都是软件来做的。
M4/3处理器在向量表放置的是函数地址
A7在向量表上放置的是跳转指令。
当函数A调到函数B
R0-R3 4个寄存器用来调用者和被调用者传递参数,函数A给函数B传递参数,函数B执行完后可以通过R0返回给函数A。 R0-R3通过函数A保存,函数B可以任意的使用R0-R3别指望它们的值不变了。这些寄存器被称为调用者保存寄存器。
R4-R11 函数B可能使用,用到哪个寄存器就保存原来的值,所以在函数B入口保存它们,在函数B出口恢复它们,这些寄存器称为被调用保存寄存器。
EXIT 外部中断控制器
NVCI 中断控制器
GIC 通用中断控制器
GIC还可以把哪个中断源发给哪个cpu CPU0或1,CPU来处理中断。
*当发生中断时有状态寄存器,我们可以读取状态寄存器来判断是否发生中断,并且处理完中断后清除中断标志寄存器。
NVIC它是中断控制器,它的中断源有来自很多种,有EXIT外部中断,有串口,定时器中断其他模块中断源,NVIC的职责就是从多个中断源中取出优先级
ISER寄存器有32位,每一位对应一个中断,比如Bit[0]用于异常16对应向量表如下图
GIC用于管理单核或多核芯片中的中断资源
- ARM公司开发了4 个版本GIC规范 ,V1~V4
- ARMv7-A内核搭配GIC-400使用
-
初始化irq模式栈指针
-
进入irq模式
- cpsr寄存器
-
保存现场
- 通用寄存器
- lr
- spsr
-
获取中断编
- 读取GIC基地址
- GICC基地址(GIC cpu interface)
- GICC_IAR寄存器
-
执行中断处理函数
- 根据中断编 ,回调IRQ中断服务表
-
还原现场
-
通用寄存器
-
lr
-
spsr
-
-
返回原程序
- 三级流水线

中断向量表
ARMv7-A
一级查表
自动跳转指定位置(基址+偏移)
addr | TYPE | FUNCTION | MODE |
---|---|---|---|
0x00 | Reset | 复位中断 | SVC |
0x04 | Undefined instructions | 未定义指令中断 | Undef |
0x08 | Supervisor Call | 软中断 | SYC |
0x0C | Prefetch abort | 指令预取中止中断 | ABT |
0x10 | Data abort | 数据访问中止中断 | ABT |
0x14 | RESERVED | 未使用 | 未使用 |
0x18 | IRQ interrupt | IRQ 中断 | IRQ |
0x1C | FIQ interrupt | FIQ 中断 | FIQ |
二级查表,执行中断函数
预先注册、回调执行
中断处理流程
中断上下文
cpu通过内核寄存器来运行指令并进行数据的读写处理的,它在进入中断前一个时刻的具体值,称为中断上下文
具体流程
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!