ARM IRQ中断

1.中断方式

中断:CPU能打断当前正在进行的工作,去处理更为紧急的任务,并且在处理完中断任务后,能回到原先的地方继续工作

中断流程

(1)中断源发出中断请求。

(2)CPU检查是否响应中断以及该终端是否被屏蔽。

(3)检查当前产生的中断的中断优先级。

(4)保护现场

(5)执行中断服务函数

(6)恢复现场

kernal:被打断的

外设:发出中断

GPIO发出的中断:外部中断(EINT)

2.中断控制器GIC

1.概念

在计算机体系结构中,中断控制器(Interrupt Controller) 是连接 CPU 与外部设备(如键盘、硬盘、网卡、定时器等)的核心 "管理枢纽",其核心作用是统一接收、优先级排序、转发外部设备的 "中断请求",确保 CPU 能高效响应设备需求,避免 CPU "轮询等待" 设备,从而大幅提升整机资源利用率。

GIC(Generic Interrupt Controller):通用的中断控制器

2.协处理器

1.概念

协处理器(Coprocessor)是一种辅助中央处理器(CPU)执行特定计算任务的专用处理器,旨在分担 CPU 的部分工作负载、提升特定场景下的计算效率或实现 CPU 不具备的特殊功能。它不能独立运行完整程序,需依赖 CPU 的指令调度和控制,本质是 CPU 的 "专用计算助手"。

2. 系统控制单元(CP15):"管理型" 协处理器

CP15 是 ARM 架构中负责系统级控制的专用单元,虽不直接参与数据计算,但承担 CPU 与内存、缓存、权限管理的 "桥梁" 角色,本质是 "系统管理协处理器",在 Cortex-A 系列中全程内置(无独立版本)。

其核心功能包括:

  • 内存管理:配置 MMU(内存管理单元)的页表基地址、内存权限(读写 / 执行),实现虚拟内存到物理内存的映射;

  • 缓存控制:启用 / 禁用 L1/L2 缓存、清空缓存数据、配置缓存策略(如写回 / 写透);

  • 权限与安全:管理 ARM 的异常级别(EL0-EL3)、配置安全状态(Secure/Non-Secure),是 TrustZone 安全架构的核心控制单元;

  • 性能监控:统计 CPU 指令执行数、缓存命中 / 缺失次数,用于性能分析。

  • 调用方式:CPU 通过 "协处理器指令"(如MCR/MRC,即 "协处理器寄存器到 CPU 寄存器的传输")操作 CP15,例如通过MCR p15, 0, r0, c1, c0, 0指令启用 MMU。

同时还可以开启icache

ARMv7-A 架构(如 Cortex-A9/A15)通过CP15 协处理器的 SCTLR(系统控制寄存器) 控制 ICache,核心步骤如下:

cpp 复制代码
mrc p15, 0, r0, c1, c0, 0   //读取cp15协处理器值到r0寄存器中
bic r0, r0, #(1 << 13)     //修改异常向量表映射方式
orr r0, r0, #(1 << 12)     //打开ICache
mcr p15, 0, r0, c1, c0, 0  //往协处理器写入

3.中断相关寄存器配置

c0 registers:

MIDR(Main ID Register):存储内核的一些基本信息

c1 registers:

SCTLR(System Control Register):

bit13:V

0 : Normal exception vectors, base address 0x00000000. Software can remap this base address using the VBAR.

正常异常向量,基址0x00000000。软件可以使用以下命令重新映射此基址

VBAR。

1 : High exception vectors, base address 0xFFFF0000. This base address is never remapped.

bit12:是否开启icache

0 Instruction caches disabled, this is the reset value.

1 Instruction caches enabled.

c12 registers:

VBAR(Vector Base Address Register):

demo:

cpp 复制代码
 __set_VBAR(0x87000000);

c15 registers:

CBAR(Configuration Base Address Register):Holds the physical base address of the memory-mapped GIC registers.

保存内存映射的GIC寄存器的物理基址。

cpp 复制代码
    mrc p15, 4, r1, c15, c0, 0     //取出GIC基地址到r1
    add r1, r1, #0x2000
    ldr r0, [r1, #0x0C]            //中断通知寄存器, C_IAR,同时传r0值给接下来的函数
    stmfd sp!, {r0, r1}
    cps #0x1F                      //设置为sys模式,可以中断的嵌套

    stmfd sp!, {lr}                //保护lr防止bl后lr被修改
    bl system_interrupt_handler

    cps #0x12                      //设为irq模式
    stmfd sp!, {lr}

    str r0, [r1, #0x10]            //中断标志寄存器, C_EOIR,结束中断
    ldmfd sp!, {r0-r12, pc}^

3.相关指令

1.mrc

在 ARM 架构中,MRC 指令(Move to ARMRegister from Coprocessor) 是用于从协处理器(Coprocessor)读取数据到 ARM 核心寄存器的专用指令。它是 ARM 处理器与协处理器(如系统控制协处理器 CP15、浮点协处理器 VFP 等)通信的关键接口,主要用于获取协处理器的状态、配置信息或运算结果。

cpp 复制代码
MRC{<cond>} p<coproc>, <opcode1>, <Rt>, <CRn>, <CRm>{, <opcode2>}
  • p<coproc>:协处理器编号(p0-p15),如p15表示系统控制协处理器(最常用)。
  • <opcode1>:协处理器操作码 1(0-7),由协处理器定义的基本操作类型。
  • <Rt>:ARM 核心的目标寄存器(r0-r15),用于存储从协处理器读取的数据。
  • <CRn>:协处理器的寄存器编号(c0-c15),指定要读取的协处理器寄存器。
  • <CRm>:协处理器的附加寄存器编号(c0-c15),用于扩展地址空间(部分协处理器可能忽略)。

2.mcr

在 ARM 架构中,MCR 指令(Move from ARM Register to Coprocessor) 是与 MRC 指令配对使用的协处理器通信指令,用于将 ARM 核心寄存器中的数据写入到协处理器(Coprocessor)的寄存器中。它主要用于配置协处理器的工作模式、设置控制参数或向协处理器传递运算所需的数据,是底层系统编程中配置硬件的关键指令。

cpp 复制代码
MCR{<cond>} p<coproc>, <opcode1>, <Rt>, <CRn>, <CRm>{, <opcode2>}

各字段含义与 MRC 指令一致,仅数据流向相反

相关推荐
linux修理工6 小时前
n1 ARMbian部署Grafana
arm开发·架构·grafana
The️1 天前
STM32-FreeRTOS操作系统-二值信号量与计数信号量
arm开发·stm32·单片机·嵌入式硬件·物联网
明天见~~2 天前
ARM 汇编学习
arm开发
Skylar_.3 天前
嵌入式 - ARM(4) 硬件介绍与开发环境搭建
arm开发
pengfei_M3 天前
一、ARM异常等级及切换
arm开发
sheepwjl3 天前
《嵌入式硬件(六):ARM汇编核心内容总结》
汇编·arm开发·嵌入式硬件
路溪非溪3 天前
Linux驱动如何向应用层提供sysfs操作接口
linux·arm开发·驱动开发
武文斌774 天前
arm启动代码总结
arm开发·嵌入式硬件·学习
ShiMetaPi4 天前
操作【GM3568JHF】FPGA+ARM异构开发板 使用指南:蓝牙
arm开发·嵌入式硬件·fpga开发·rk3568