ARM IRQ中断

发布于:2025-09-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

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,核心步骤如下:

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:

 __set_VBAR(0x87000000);


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

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

    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 等)通信的关键接口,主要用于获取协处理器的状态、配置信息或运算结果。

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)的寄存器中。它主要用于配置协处理器的工作模式、设置控制参数或向协处理器传递运算所需的数据,是底层系统编程中配置硬件的关键指令。

MCR{<cond>} p<coproc>, <opcode1>, <Rt>, <CRn>, <CRm>{, <opcode2>}

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


网站公告

今日签到

点亮在社区的每一天
去签到