一、51 单片机中断简单回顾
51 中断处理流程:
- 外设产生中断信号
- 内核层面:开启 CPU 总中断、开启对应中断源中断、配置中断优先级
- CPU 跳转执行中断服务函数
ARM Cortex‑A(IMX6ULL)中断逻辑比 51 复杂很多,引入了专门的GIC 通用中断控制器来管理全部硬件中断。
二、什么是 GIC?【思考题 1:什么是 GIC?你所使用的 GIC 版本、GIC 型号?】
GIC(Generic Interrupt Controller,通用中断控制器),是 ARM 官方设计、专门用于管理 Cortex‑A 系列处理器中断的片上外设,属于 ARM 知识产权,芯片厂商需要付费授权使用。
- 我使用的芯片:IMX6ULL(NXP 设计 SOC,内核为 Cortex‑A7)
- GIC 版本:GIC V2
- GIC 型号:GIC‑400
GIC 各版本简介
| 版本 | 特点 | 适用芯片 |
|---|---|---|
| GIC V1 | 老旧版本 | Cortex‑A5 |
| GIC V2 | 支持虚拟化、最多 8 核,最大支持 1020 个中断 | 32 位 Cortex‑A7,IMX6ULL、树莓派 |
| GIC V3‑V4 | 支持 8 核以上,性能提升 | 64 位手机处理器 |
| GIC V5 | 全新架构,支持数百核 | 服务器、车载算力芯片 |
三、GIC 中断分类【思考题 2:GIC 将中断分为哪三类?】
GIC 把中断源分为 SPI、PPI、SGI 三类:
- SPI 共享中断:来自片内外设产生的硬件中断,多核下任意 CPU 核都可以处理该中断。
- PPI 私有中断:CPU 核私有中断,用于多核之间核间通信,和片上外设无关。
- SGI 软件中断:由软件代码主动触发产生的中断,多用于多核通信。
四、中断数量【思考题 3:GIC 控制器支持多少个中断?IMX6ULL 芯片支持多少个中断?】
- GIC 控制器理论最大支持 1020 个中断源;
- IMX6ULL 芯片实际只使用其中一部分,支持 160 个中断(中断号 0~159)。
五、外设发起中断到内核处理完成完整流程【思考题 4:简述从外设发起中断到内核处理完中断的过程?】
以 IMX6ULL 按键 EINT 外部按键中断为例
① 外设端配置与产生中断
- 配置外设寄存器:设置引脚中断触发方式(上升沿 / 下降沿);
- 使能该引脚的中断输出;
- 外设产生中断信号,发送中断请求给到 GIC 控制器。
示例寄存器(GPIO 中断)
GPIO1_ICR2:配置引脚中断触发方式GPIO1_IMR:使能引脚中断GPIO1_ISR:中断状态寄存器,写 1 清除中断标志
② GIC 控制器处理中断
- GIC 配置:开启对应中断源允许 / 屏蔽位,设置中断优先级;
- GIC 做优先级比较,选出优先级最高的中断,向 CPU 内核发出 IRQ/FIQ 中断信号。
③ CPU 内核处理中断(kernel 侧)
- CPU 打开 CPU 级中断允许 / 屏蔽(CPSR 寄存器);
- CPU 硬件自动切换处理器工作模式,进入 IRQ 异常模式;
- 跳转到异常向量表;
- 内核读取 GIC 的
C_IAR(中断通知寄存器,只读),拿到发生中断的中断号,判断是哪个外设产生中断; - 根据中断号执行对应 IRQ 中断服务函数;
- 中断服务处理完成,将中断号写入
C_EOIR(中断结束寄存器,只写),通知 GIC 本次中断处理结束; - CPU 恢复原来的处理器工作模式,回到被打断的程序继续运行。
关键 GIC 寄存器
- C_IAR:只读,获取中断号
- C_EOIR:只写,写中断号标记中断处理完毕
六、协处理器 cp15 与相关汇编、内联函数
协处理器
协处理器是协助 CPU 完成特定功能的专用单元,ARM 有 cp0~cp15,cp15 最重要,用来配置 MMU、Cache、异常向量表重映射等系统功能。
两条核心汇编指令:
mrc:把协处理器寄存器读取到 CPU 通用寄存器mcr:把 CPU 通用寄存器数据写入协处理器寄存器
示例代码片段
; 将cp15的SCTLR寄存器读到r0
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #(1 <<13)
orr r0, r0, #(1 << 12) ; 打开icache
mcr p15, 0, r0, c1, c0, 0 ; 将r0写回SCTLR
; 设置异常向量表基地址
mcr p15, 0, r0, c12, c0, 0
; 获取GIC基地址到r0
mrc p15, 4, r0, c15, c0, 0
inline 内联函数
- 本质是函数,调用前必须有函数定义;
- 编译阶段,在调用点直接把函数代码展开,省去函数调用跳转开销,提升运行效率。
176



被折叠的 条评论
为什么被折叠?



