GIC介绍、中断函数过程
中断
Cortex-A7中断向量表
中断向量偏移
GIC 控制器总览
- SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断 。比如按键中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。
- PPI(Private Peripheral Interrupt),私有中断,我们说了 GIC 是支持多核的,每个核肯定有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。
- SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信
中断 ID
对于imx6ull 可以在参考手册中查询其中断号,见下图
CP15协处理器
Reset_Handler函数工作
- 关闭中断
- 关闭I/D Cache MMU 分支预测 (控制SCTLR寄存器)
- 配置VBAR
隔离指令
配置VBAR - 清除BSS段
- 设置对应中断模式的SP指针
- 开启中断
- 跳到main函数
IRQ_Handler函数工作
- 压栈 lr spsr 等
- 读取c15 CBAR寄存器 获取GIC控制器的基地址,访问GIC控制器的寄存器
- 获取到GIC控制器CPU端基地址
- 获取到CPU端的GICC_IAR寄存器
- 进入到svc模式(可以再次进入中断)
- 跳转到C语言的system_irqhandler函数,传入GIC控制器地址和GICC_IAR寄存器 ,通过低9位获取到中断ID
- 进入到IRQ模式
- 将GICC_IAR寄存器的值(对应的中断ID)写入到GICC_EOIR中
- 出栈lr spsr 恢复spsr 将lr-4赋给pc(ARM流水线)
配置imx6ull IO的中断寄存器
- 配置ICR寄存器
- 配置IMR寄存器
- 使能GIC控制器对应的中断号,配置其优先级,注册对应中断号的函数
- 中断发生后配置ISR寄存器写1