ARM裸机开发|IMX6ULL GIC中断详解,中断流程、GIC版本分类、CP15协处理器

一、51单片机中断回顾

简单回顾51单片机中断处理四步:

  1. 设置CPU全局中断允许/屏蔽

  2. 设置外设中断源允许/屏蔽

  3. 配置中断优先级

  4. 执行对应的中断服务函数

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引脚中断为例,外设层需要配置如下寄存器:

  1. GPIO1_ICR2:配置引脚中断触发方式,例如下降沿触发中断

  2. GPIO1_IMR:中断屏蔽寄存器,使能该引脚中断

  3. GPIO1_ISR:中断状态寄存器,判断引脚是否产生中断;写1清0

GIC核心寄存器

  1. C_IAR(只读):中断确认寄存器,内核读取该寄存器获取中断号,用来区分是哪个外设触发中断。

  2. 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中断学习总结

  1. IMX6ULL CortexA7使用GIC V2通用中断控制器管理所有中断,区分SPI、PPI、SGI三类中断源;

  2. 完整中断链路:外设配置 → GIC控制器仲裁分发 → CPU切换IRQ模式 → 跳异常向量表 → 执行中断服务函数 → 通知GIC中断结束;

  3. GPIO中断寄存器:ICR2配置触发方式,IMR使能中断,ISR判断中断状态(写1清0);

  4. GIC的C_IAR读中断号,C_EOIR写回中断号标记中断处理完成;

  5. CP15协处理器使用mrc/mcr读写,用于Cache、异常向量表重映射等系统配置;

  6. inline内联函数编译时展开,减少函数调用开销。

相关推荐
myy-learn2 小时前
ARM-复用寄存器以及电气寄存器深化-蜂鸣器
arm
祖力554 小时前
ARM中断(IMX6ULL中断、GIC通用中断控制器)
嵌入式硬件·arm·imx6ull·中断·gic·通用中断控制器
susplus19 小时前
【ARM 裸机开发 (IMX6ULL-mini)】GNU工具、Makefile 工程构建、链接脚本详解|C 语言点灯 + 蜂鸣器驱动
linux·arm·makefile·imx6ull
斑马1391 天前
ARM学习笔记(二)——ARM汇编基础
汇编·arm开发·arm
朝发如雪2 天前
快速掌握单片机基础(6)(数据处理与传送指令)(跳转与分支指令)(栈操作与混合编程)(程序状态寄存器操作指令)(内存映射)
单片机·arm
晊晌_h2 天前
ARM 学习 |ARM 汇编指令实战笔记
嵌入式·arm·arm汇编
斑马1392 天前
ARM学习笔记(一)——基本概念
arm开发·arm
G.E.M.小白2 天前
【IMX6ULL裸机LED开发全程解析】存储架构 + 编译链接 + 内存段 + Makefile
嵌入式·imx6ull·裸机开发
一直C2 天前
ARM裸机开发Day04|IMX6ULL汇编&C点灯实操,Makefile、链接脚本、段解析
嵌入式硬件·imx6ull·交叉编译