Cortex-A7 中断系统简介
向量地址 | 中断类型 | 中断模式 |
---|---|---|
0X00 | 复位中断(Rest) | 特权模式(SVC) |
0X04 | 未定义指令中断(Undefined Instruction) | 未定义指令中止模式(Undef) |
0X08 | 软中断(Software Interrupt,SWI) | 特权模式(SVC) |
0X0C | 指令预取中止中断(Prefetch Abort) | 中止模式 |
0X10 | 数据访问中止中断(Data Abort) | 中止模式 |
0X14 | 未使用(Not Used) | 未使用 |
0X18 | IRQ 中断(IRQ Interrupt) | 外部中断模式(IRQ) |
0X1C | FIQ 中断(FIQ Interrupt | 快速中断模式(FIQ) |
GIC 控制器简介
1、 GIC接收众多的外部中断,最终只有4个信号报给ARM内核。
VFIQ:虚拟快速 FIQ。
VIRQ:虚拟快速 IRQ
FIQ:快速中断 IRQ。
IRQ:外部中断 IR
2、GICV2 总体框图
①SPI是共享中断,所有Core共享的中断,这个是最常见的,那些外部中断都属于SPI中断。比如按键中断、串口中断等等。
②PPI是私有中断,我们说了GIC是支持多个核的,每个核肯定有自己独有的中断。
③SGI是软件中断,由软件触发引起的中断,通过向寄存器GICD_SGIR写入数据来触发,系统会使用SGI中断来完成多核之间的通讯。
④中断ID
ID0~ID15分配给SGI。
ID16~ID31分配给PPI。
ID32~ID1019分配给SPI
⑤GIC逻辑分块
Distributor(分发器端)
此逻辑块负责处理各个中断时间的分发问题,也就是中断事件应该发送到哪个CPU Interface上去。分发器收集所有的中断源,可以控制每个中断的优先级,它总是将优先级最高的中断事件发送到CPU接口端。分发器端要做的主要工作如下:
a.全局中断使能控制。
b.控制每一个中断的使能或者关闭。
c.设置每个中断的优先级
d.设置每个中断的目标处理器列表
e.设置每个外部中断的触发模式:电平触发或者边沿触发。
f.设置每个中断属于组0还是组1
CPU Interface(CPU 接口端)
CPU接口端就是分发器和CPU Core之间的桥梁,CPU接口端主要工作如下:
a.使能或者关闭发送到CPU Core的中断请求信号。
b.应答中断
c.通知中断处理完成
d.设置优先级掩码,通过掩码来设置哪些中断不需要上报给CPU Core
e.定义抢占策略
f.当多个中断到来的时候,选择优先级最高的中断通知给CPU Core
CP15协处理器
主要是使能或者禁止MMU、I/D Cache等
中断使能
IRQ和FIQ总中断使能
指令 | 描述 |
---|---|
cpsid i | 禁止IRQ中断 |
cpsie i | 使能IRQ中断 |
cpsid f | 禁止FIQ中断 |
cpsie f | 使能FIQ中断 |
ID0~ID1019中断使能和禁止
GIC寄存器GICD_ISENABLERn和GICD_ICENABLERn用来完成外部中断的使能和禁止,对于Cortex-A7内核来说中断ID只能使用512个。一个bit控制一个中断ID的使能,那么就需要512/32=16个GICD_ISENABLERn寄存器来完成中断的使能。同理,也需要16个GICD_ICENABLERn寄存器来完成中断的禁止。其中GICD_ISENABLERn的bit[15:0]对应ID15~0de SGI中断,GICD_ISENABLERn的bit[31:16]对应ID31~16的PPI中断。剩下的GICD_ISENABLERn就是控制SPI中断的。
中断优先级设置
优先级数配置
GICC_PMR寄存器只有低8位有效,这个8位最多可以设置256个优先级,其他优先级数设置如下表
抢占优先级和子优先级位数设置
抢占优先级和子优先级各占多少位是由寄存器GICC_BPPR来决定的,GICC_BPR寄存器结构如下:
GICC_BPR只有低3位有效,其值不同,抢占优先级和子优先级占用的位数也不同,配置如下:
为了简单起见,一般将所有的中断优先级位都配置为抢占优先级,比如6U的优先级位数为5(32个优先级),所以可以设置Binary poin为2,表示5个优先级位全部为抢占优先级。
优先级设置
Cortex-A7使用了512个中断ID,每个中断ID配有一个优先级寄存器,所以一共有512个D_IPRIORITYR寄存器。如果优先级个数为32的话,使用寄存器D_IPRIORITYR的bit7:4来设置优先级。
优先级设置主要有三部分:
①设置寄存器GICC_PMR,配置优先级个数,比如I.MX6U支持32级优先级
②设置抢占优先级和子优先级位数,一般为了简单起见,会将所有的位数都设置为抢占优先级
③设置指定中断的ID的优先级,也就是设置外设优先级
简单总结:
1、 6U有8中中断类型
2、 GIC控制器有三类中断源,SPI、PPI、SGI;能设置中断优先级,抢占优先级和子优先级。
3、 CP15协处理器是开关I/D cache、MMU、获取GIC寄存器