ARM中断处理与GIC
第一部分:中断处理基本流程
- 中断响应过程
· 中断源发出中断请求。
· CPU检查是否响应中断,以及该中断是否被屏蔽。
· 检查当前产生的中断的优先级。
· 保护现场(保存当前程序的上下文)。
· 执行中断服务函数。
· 恢复现场(恢复之前保存的上下文)。
第二部分:协处理器与相关指令
- 协处理器编号
· cp0 ~ cp15:ARM架构中的协处理器。
· A7内核中:cp10、cp11用于浮点运算,cp15用于存储管理。
· CP10:浮点型运算。
· CP15:存储管理(如Cache控制、MMU、异常向量表基地址等)。
- 协处理器访问指令
· MRC:将协处理器寄存器内容读到ARM寄存器。
· MCR:将ARM寄存器内容写入协处理器寄存器。
· 常用操作示例:
· 读取cp15的c1寄存器,修改后写回,用于打开iCache、设置异常向量表基地址选择VBAR。
· 读取cp15的c15寄存器,获取GIC基地址。
第三部分:GIC(通用中断控制器)
- GIC的作用
· 接收来自外设的中断请求,进行优先级仲裁,然后分发给CPU。
· 流程:中断源 → GIC → processor 0。
- GIC初始化步骤
· 调用GIC_Init()进行初始化。
· 设置中断优先级(GIC_SetPriority)。
· 设置中断使能(GIC_EnableIRQ)。
· 获取GIC基地址(通过读取cp15的c15寄存器)。
· 操作中断通知寄存器(C_IAR,位于GIC基地址+0x200C)读取中断号。
· 操作中断结束寄存器(C_EOIR,位于GIC基地址+0x2010)写入中断号,表示中断处理结束。
- 启动代码中的基地址重映射
· 将基地址重映射到0x87800000。
· 通过cp15设置异常向量表基地址选择VBAR。
· 打开iCache。
第四部分:GPIO中断相关寄存器
- 中断触发方式寄存器(GPIOX_ICR2)
· 配置GPIO引脚的中断触发方式(如上升沿、下降沿、双边沿等)。
- 中断屏蔽寄存器(GPIOX_IMR)
· 设置是否屏蔽某引脚的中断。
· 对应位为1表示使能,为0表示屏蔽。
- 中断状态寄存器(GPIOX_ISR)
· 指示当前产生中断的引脚。
· 通过读取该寄存器判断中断源,并在中断服务函数中清除标志位(写1清除)。
第五部分:中断处理代码流程
- 汇编异常向量处理函数(irq)
· 调整返回地址:sub lr, lr, #4。
· 保存现场:将r0-r12和lr压栈。
· 获取GIC基地址。
· 切换到sys模式(cps #0x1F),保存lr。
· 调用C语言中断处理函数(bl system_interrupt_handler)。
· 恢复lr,切换回irq模式(cps #0x12)。
· 恢复现场:出栈r0-r12。
· 写EOIR寄存器,通知GIC中断处理结束。
· 恢复pc,返回。
- C语言中断服务函数
· 函数原型:void system_interrupt_handler(IRQn_Type irq)。
· 判断中断号是否等于GPIO中断号。
· 检查GPIO中断状态寄存器,判断具体引脚。
· 执行相应处理(如点灯)。
· 清除中断标志位(写1到ISR寄存器)。
第六部分:关键概念与注意事项
- 中断优先级
· GIC支持中断优先级设置,高优先级中断可抢占低优先级中断。
- 中断屏蔽
· 通过IMR寄存器可屏蔽特定中断源。
- 中断标志清除
· 中断服务函数中必须清除中断标志,否则会反复触发中断。
· GPIO中断通过写1到ISR寄存器对应位清除。
- 模式切换
· ARM有多种处理器模式,中断处理时需在irq模式和sys模式之间切换。
· irq模式用于响应中断,sys模式用于运行特权级操作系统代码。
- 现场保护与恢复
· 中断发生时必须保存当前程序的寄存器状态,处理完毕后恢复,保证被中断的程序能正确继续执行。
- 异常向量表基地址
· 通过VBAR寄存器设置异常向量表的基地址。
· 启动代码中需重映射基地址并设置VBAR。