一、51单片机中断回顾
简单回顾51单片机中断处理四步:
-
设置CPU全局中断允许/屏蔽
-
设置外设中断源允许/屏蔽
-
配置中断优先级
-
执行对应的中断服务函数
IMX6ULL CortexA7中断逻辑比51复杂很多,引入GIC通用中断控制器来管理全部中断源。
二、IMX6ULL中断整体框架

中断完整执行流程
1. 外设层:配置外设中断触发方式,使能外设引脚中断;
2. GIC通用中断控制器
-
设置中断源允许/屏蔽
-
设置中断优先级
-
硬件比较优先级,分发中断;
3. CPU内核CortexA7
-
通过CPSR寄存器设置CPU全局IRQ/FIQ中断允许/屏蔽
-
切换CPU处理器工作模式(IRQ模式)
-
跳转到异常向量表
-
执行IRQ中断服务函数
-
中断处理完成,恢复CPU原有工作模式
IMX6ULL硬件分工说明:
-
CortexA7内核、GIC中断控制器:ARM官方设计
-
SOC片内外设(GPIO、TIMER、UART):NXP设计
三、GIC版本介绍
GIC(Generic Interrupt Controller)是ARM为CortexA系列专门设计的中断管理外设。
|----------------|------------------------------|-----------------------------|
| GIC 版本 | 适用芯片 | 特点 |
| GIC V1 | CortexA5 老款嵌入式芯片 | 早期版本,无虚拟化支持 |
| GIC V2 | IMX6ULL、树莓派 3(32 位 CortexA7) | 支持虚拟化,最多支持 1020 个中断源,最多 8 核 |
| GIC V3/V4 | 64 位处理器(手机芯片) | 支持超过 8 核,性能提升 |
| GIC V5 | 服务器、车载算力芯片 | 全新架构,支持数百核处理器 |
IMX6ULL使用 GIC V2,硬件实际支持160个中断源,GICV2理论最大支持1020个中断。
GIC三大中断分类
1. SPI 共享外设中断
外设产生的中断,多核环境下任意CPU核都可以处理该中断,GPIO、定时器、UART都属于SPI中断。
2. PPI 私有中断
和外设无关,用于多核CPU核与核之间通信,每个CPU私有。
3. SGI 软件产生中断
由软件代码主动触发的中断,多用于多核之间通信。
四、GPIO外部中断相关寄存器
以GPIO引脚中断为例,外设层需要配置如下寄存器:
-
GPIO1_ICR2:配置引脚中断触发方式,例如下降沿触发中断
-
GPIO1_IMR:中断屏蔽寄存器,使能该引脚中断
-
GPIO1_ISR:中断状态寄存器,判断引脚是否产生中断;写1清0
GIC核心寄存器
-
C_IAR(只读):中断确认寄存器,内核读取该寄存器获取中断号,用来区分是哪个外设触发中断。
-
C_EOIR(只写):中断结束寄存器,中断服务函数执行完毕,必须把中断号写入此寄存器,通知GIC本次中断处理完成。
五、CP15协处理器(CortexA7重点)
协处理器:专门协助CPU完成特定功能的硬件单元,编号cp0 ~ cp15。
在CortexA7中,CP15是最重要的系统控制协处理器,用来管理MMU、Cache、异常向量表基地址等系统配置。
两条核心汇编指令
-
mrc:读取协处理器寄存器数据,拷贝到ARM通用寄存器
-
mcr:把ARM通用寄存器数据,写入协处理器寄存器
指令格式:
asm
mrc <coproc, <opc1, <Rt, <CRn, <CRm{, <opc2}
示例代码:
asm
;读取CP15的SCTLR系统控制寄存器到r0
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, (1 <<13) ;清除对应bit位
orr r0, r0, (1 << 12) ;打开ICache
将修改后的值写回SCTLR寄存器
mcr p15, 0, r0, c1, c0, 0
设置异常向量表基地址,完成异常向量表重映射
mcr p15, 0, r0, c12, c0, 0
读取GIC控制器基地址到r0
mrc p15, 4, r0, c15, c0, 0
异常向量表重映射:裸机开发可以把异常向量表放置在DDR内存0x87800000地址,通过cp15 c12寄存器告诉CPU向量表新地址。
六、inline内联函数小知识点
-
inline:内联函数,本质仍然是函数;
-
使用前提:调用前必须看到函数完整定义;
-
编译阶段,在调用位置直接展开函数代码,消除函数调用的栈开销,提升执行效率。
七、Day04中断学习总结
-
IMX6ULL CortexA7使用GIC V2通用中断控制器管理所有中断,区分SPI、PPI、SGI三类中断源;
-
完整中断链路:外设配置 → GIC控制器仲裁分发 → CPU切换IRQ模式 → 跳异常向量表 → 执行中断服务函数 → 通知GIC中断结束;
-
GPIO中断寄存器:ICR2配置触发方式,IMR使能中断,ISR判断中断状态(写1清0);
-
GIC的C_IAR读中断号,C_EOIR写回中断号标记中断处理完成;
-
CP15协处理器使用mrc/mcr读写,用于Cache、异常向量表重映射等系统配置;
-
inline内联函数编译时展开,减少函数调用开销。