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