ARM ---day5 中断

📅 2026/7/22 4:39:08
ARM ---day5 中断
1. 什么是GICGIC通用中断控制器Generic Interrupt Controller是 ARM Cortex-A/R 系列常用的中断管理 IP作用类似 Cortex-M 中的 NVIC。它统一管理外设中断和处理器内部中断负责中断使能、屏蔽、优先级仲裁、目标 CPU 选择和中断分发最终向 CPU 内核产生 IRQ/FIQ 请求。GIC 管理的中断主要包括外设来的共享中断 SPI以及 CPU 核内部/私有的 SGI、PPI外设中断来自 UART、GPIO、Timer 等模块内部中断来自 CPU 私有定时器、软件中断、性能监控等。路由分发中断分发指 GIC 根据配置决定某个中断应该送到哪个 CPU 核处理。在多核 ARM 中GIC 可以把不同中断分配给不同 CPU 核。2. 什么是协处理器ARM Cortex A7内核配备了几个协处理器协处理器是辅助 ARM CPU 完成特定功能的硬件模块用于扩展 CPU 功能。ARM 处理器通过 MRC、MCR 等协处理器指令访问协处理器。Cortex-A7 属于 ARMv7-A 架构支持 CP0~CP15 共 16 个协处理器编号。其中最常用的是 CP15 系统控制协处理器用于管理 MMU、Cache、TLB、异常向量表等。在 Cortex-A7 中程序可以通过 CP15 设置 VBAR 寄存器将异常向量表的基地址写入 VBAR使处理器发生异常时从该地址开始查找对应的异常入口。mrc读取cp15寄存器的数据mcr向cp15寄存器中写入数据3. 为什么要将异常向量表重映射如何重映射异常向量表为什么要重映射异常向量表ARM 处理器发生异常时会到固定地址取异常入口指令。默认异常向量表通常位于 0x00000000但该地址上电时可能映射到 ROM、Flash 或 BootROM不方便修改速度也可能较慢。系统运行后通常希望把异常向量表放到 RAM 中便于修改异常处理函数、提高响应速度并让操作系统接管异常和中断因此需要异常向量表重映射。如何重映射对于 Cortex-A7 这类 ARMv7-A 内核可以通过 CP15 的 VBAR 寄存器设置异常向量表基地址。例如_set_vbar:ldr r0, 0x87800000mcr p15, 0, r0, c12, c0, 0bx lr对于 ARM9/S3C2440 这类处理器通常通过存储器重映射、MMU 映射或者设置高地址异常向量位使异常向量表位于 0x00000000 或 0xFFFF0000。4. GIC支持多少个中断分为哪几类GIC1020个中断imx6ull0-159 支持160个中断SPI共享外设中断外设所产生的的中断32-1019PPI私有外设中断核间通信内核和内核之间的中断16 - 31SGI软中断软件产生的中断0 - 155. IMX6ULL中支持多少个中断imx6ull0-159 支持160个中断6. GIC控制器的版本GIC v1 CortexA5GIC v2 32位处理器CortexA7GIC v3 - v4 64位处理器CortexA53手机芯片GIC v5 重新架构数百核处理器算力要求高的芯片 服务器imx6ull 内核是CortexA7用的是GIC v2 4007. 简述 GIC CPU Interface 中 C_IAR 和 C_EOIR 寄存器的作用。C_IARInterrupt Acknowledge Register中断应答寄存器。作用CPU 进入 IRQ 中断后读取 C_IARGIC 会返回当前要处理的中断号例如 99。C_EOIREnd Of Interrupt Register中断结束寄存器。作用中断服务函数执行完后把刚才的中断号 99 写回 C_EOIR通知 GIC 这个中断已经处理完成。GIC 中的 C_IAR 是中断应答寄存器。当外设中断产生后GIC 根据使能状态和优先级选择一个中断送给 CPU。CPU 进入中断处理程序后通过读取 C_IAR 获得当前正在响应的中断号例如按键中断号 99。中断服务函数执行完后需要将该中断号写入 C_EOIR 中断结束寄存器通知 GIC 本次中断处理完成使 GIC 可以清除该中断的活跃状态并继续响应其他中断。C_IAR 是“读中断号开始处理”C_EOIR 是“写中断号告诉 GIC 处理完了”。8.按键中断流程按键KEY0 ----GPIO1_18外设配置引脚复用功能配置引脚电气属性配置输入方向配置中断触发方式下降沿使能GPIO1_18引脚中断GIC1.初始化GIC GIC_Init();2.使能GPIO1_18引脚中断GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);3.设置优先级内核使能irq中断按键按下切换工作模式-IRQ模式自动pc -irq_handler(汇编 传参 中断号 R0)执行irq中断服务函数system_interrupt_handler/ system_irq_handler