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 指令一致,仅数据流向相反

相关推荐
VekiSon3 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
AI+程序员在路上4 小时前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
17(无规则自律)10 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞1 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发