硬件层面
按键一端接GPIO引脚,另一端接GND/VCC,配合内部上拉/下拉电阻,按键按下时GPIO电平发生跳变,触发GPIO中断模块产生中断请求。
软件实现步骤
- 配置对应GPIO引脚为输入模式,设置中断触发方式(下降沿/上升沿/双边沿),开启GPIO中断输出;
- 配置GIC控制器,使能该GPIO对应的中断号,设置中断优先级与CPU路由;
- 注册中断服务函数,将其与对应中断号绑定;
- 开启CPU总中断;
- 按键触发时,中断请求经GIC送达CPU,CPU自动保存现场并跳转到中断服务函数;
- 中断服务函数内:清除中断挂起标志、执行按键业务逻辑(消抖、键值处理)、向GIC发送中断结束指令;
- CPU恢复现场,返回被打断的主程序。
2. GIC 的定义、版本与型号
GIC 全称 Generic Interrupt Controller(通用中断控制器),是ARM公司为Cortex-A/R系列内核设计的标准中断控制器。
- 核心作用:统一管理系统所有中断源,完成中断优先级仲裁、中断屏蔽、中断路由分发,将中断递送给指定CPU内核,是多核系统中断调度的核心。
- 常用版本:GIC v1、v2、v3、v4;i.MX6ULL 使用 GIC v2 版本,具体为ARM GIC-400(PL390架构实现)。
3. GIC 中断的三种类型
GIC v2 按中断来源和作用范围,将中断分为三类:
- SGI(软件生成中断) :中断号
0~15,由软件写寄存器触发,主要用于多核之间的核间通信(IPI)。 - PPI(私有外设中断) :中断号
16~31,每个CPU核私有,仅对当前核生效,例如CPU本地定时器、性能监控中断。 - SPI(共享外设中断) :中断号
32及以上,所有CPU核共享,可路由到任意CPU核,是各类外设中断的主要载体(如 UART、GPIO、I2C 等)。
4. GIC 支持的中断数量
- GIC v2 架构层面 :最多支持 1020个中断ID (编号
0~1019),包含16个SGI、16个PPI、最多988个SPI;其中GIC-400具体实现最多支持480个SPI中断。 - i.MX6ULL 芯片层面 :实际裁剪实现了 160个中断源(16个SGI + 16个PPI + 128个SPI外设中断)。
5. 从外设中断到内核处理的完整流程
- 外设产生请求:外设触发事件后,向GIC发送硬件中断请求信号;
- GIC仲裁分发:GIC接收请求,根据优先级、屏蔽状态进行仲裁,将最高优先级中断路由到目标CPU核;
- CPU响应中断:CPU检测到中断信号,自动保存当前程序现场(寄存器、PC指针),跳转到中断向量表;
- 向量表分发:中断向量表根据中断号,跳转到对应的中断处理入口函数;
- GIC应答与调度:GIC驱动确认中断号、应答中断,调用预先注册的外设中断服务函数(ISR);
- 执行中断服务:ISR处理外设具体业务,清除外设端的中断标志;
- 中断收尾 :处理完成后,向GIC发送**EOI(中断结束)**命令,GIC解除该中断的挂起状态;
- 恢复现场:CPU恢复之前保存的寄存器上下文,返回被中断的程序继续执行。