最近在系统学习嵌入式底层,之前写单片机代码,一直停留在"调用库函数点灯、串口打印"的层面。代码能跑,但一旦遇到中断卡死、程序跑飞这类问题,完全无从下手。直到开始啃ARM Core的基础架构,才恍然大悟:中断本质就是ARM的异常,而异常会自动切换处理器工作模式。
这篇笔记就结合课堂所学,梳理ARM内核、7种工作模式、异常处理完整流程,帮大家打通嵌入式底层最重要的一环。
一、什么是ARM Core?
很多初学者容易混淆ARM Core和SOC芯片。
ARM Core,也就是ARM内核,是基于RISC精简指令集的CPU核心电路,是芯片里面负责取指、运算、执行指令、处理异常的主体。
它内部包含:寄存器组、ALU算术逻辑单元、桶形移位器、硬件乘法器、指令流水线、异常控制硬件。
划重点:ARM内核本身不带外设。像STM32这类SOC芯片,是厂商拿到ARM Core之后,外挂RAM、ROM、定时器、串口等外设,封装成完整芯片。
ARM内核一共有37个32位寄存器。除了通用寄存器R0~R15,还有CPSR(当前程序状态寄存器)和SPSR(备份程序状态寄存器)。
不同工作模式下会启用影子寄存器,最典型就是R13(SP栈指针)、R14(LR链接寄存器)和SPSR,用来在发生异常时保存现场。
二、ARM的7种基础工作模式
ARM处理器有7个基础工作模式,分为特权模式和非特权模式,其中5种属于异常模式,由异常事件触发。
模式 名称 触发条件
User 用户模式 非特权模式,普通应用程序运行,不由异常触发
FIQ 快速中断模式 高优先级快速中断触发
IRQ 普通中断模式 常规外部中断触发
Supervisor(SVC) 管理模式 复位、软中断SWI触发,操作系统内核常用
Abort 中止模式 内存访问出错(预取中止、数据中止)触发
Undef 未定义指令模式 CPU读到无法识别的指令时触发
System 系统模式 特权模式,寄存器和User完全一致,手动修改CPSR进入,不由异常触发
简单理解:
• User模式权限最低,不能直接修改底层寄存器,用来跑普通业务代码;
• FIQ、IRQ就是我们常说的中断模式;
• 一旦发生异常,硬件会自动切换到对应的异常模式,使用该模式专属的影子寄存器,避免破坏用户程序现场。
补充:Cortex-A系列还有Monitor模式,是TrustZone安全扩展引入的,用于安全监控。
三、ARM异常处理完整流程
异常就是打断当前程序正常执行的事件,复位、中断、非法指令都属于异常。ARM有一张异常向量表,每个异常对应固定偏移地址:
0x00 Reset,0x04 Undefined Instruction,0x08 Software Interrupt,0x0C Prefetch Abort,0x10 Data Abort,0x18 IRQ,0x1C FIQ。
✅ 异常产生:硬件自动完成这几步
-
把当前CPSR拷贝保存到SPSR_<当前异常模式>,备份程序状态;
-
修改CPSR:强制进入ARM指令状态,切换为对应的异常模式,屏蔽对应中断;
-
将异常返回地址保存到LR_<异常模式>;
-
PC跳转到异常向量表对应的偏移地址,开始执行异常服务函数。
✅ 异常返回:软件指令完成恢复
-
从SPSR_恢复CPSR,把处理器状态、模式、中断屏蔽位恢复成异常之前;
-
从LR_恢复PC,回到原来的代码继续运行。
重要笔记:异常返回操作,只能在ARM状态下执行。
四、学习感悟
以前写中断程序,只知道开中断、写中断服务函数。学完ARM异常机制才明白:我们写的中断服务函数,只是整个异常流程的后半段。保存现场、切换模式、跳转向量,全部由ARM内核硬件自动完成。
底层原理不是纸上谈兵。看懂这部分,以后遇到中断嵌套、程序死机、内存访问错误,就不再只会盲目调试,可以从模式切换、现场保存、向量表这几个方向排查问题。嵌入式开发,底层知识永远是上限。
小结
-
ARM Core是处理器内核,负责指令执行、运算与异常处理;
-
ARM有7种工作模式,异常发生时硬件自动切换到对应异常模式;
-
异常处理分为硬件自动保存现场,以及软件恢复现场两个阶段。
。