学习ARM

最近在系统学习嵌入式底层,之前写单片机代码,一直停留在"调用库函数点灯、串口打印"的层面。代码能跑,但一旦遇到中断卡死、程序跑飞这类问题,完全无从下手。直到开始啃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。

✅ 异常产生:硬件自动完成这几步

  1. 把当前CPSR拷贝保存到SPSR_<当前异常模式>,备份程序状态;

  2. 修改CPSR:强制进入ARM指令状态,切换为对应的异常模式,屏蔽对应中断;

  3. 将异常返回地址保存到LR_<异常模式>;

  4. PC跳转到异常向量表对应的偏移地址,开始执行异常服务函数。

✅ 异常返回:软件指令完成恢复

  1. 从SPSR_恢复CPSR,把处理器状态、模式、中断屏蔽位恢复成异常之前;

  2. 从LR_恢复PC,回到原来的代码继续运行。

    重要笔记:异常返回操作,只能在ARM状态下执行。

    四、学习感悟

以前写中断程序,只知道开中断、写中断服务函数。学完ARM异常机制才明白:我们写的中断服务函数,只是整个异常流程的后半段。保存现场、切换模式、跳转向量,全部由ARM内核硬件自动完成。

底层原理不是纸上谈兵。看懂这部分,以后遇到中断嵌套、程序死机、内存访问错误,就不再只会盲目调试,可以从模式切换、现场保存、向量表这几个方向排查问题。嵌入式开发,底层知识永远是上限。

小结

  1. ARM Core是处理器内核,负责指令执行、运算与异常处理;

  2. ARM有7种工作模式,异常发生时硬件自动切换到对应异常模式;

  3. 异常处理分为硬件自动保存现场,以及软件恢复现场两个阶段。

相关推荐
今年下半年2 小时前
mysql数据库备份详细操作流程
学习·mysql
湘美书院--湘美谈教育2 小时前
湘美书院夜谈录:AI时代的体验感与选择价值观念
人工智能·深度学习·学习·安全·生活
小雪崩2 小时前
嵌入式学习 day49:ARM基础
嵌入式硬件·学习
田径他爸来了2 小时前
嵌入式学习第38天——裸机imx6ull(uart接口;配置波特率为115200,8位数据位,无校验,一位停止位)
嵌入式硬件·学习
qeen872 小时前
【Linux】操作系统之进程介绍(一)
linux·笔记·学习·进程
传奇开心果编程3 小时前
【Rust入门知识点学与练】第36课:所有权——移动、借用、Copy、切片
开发语言·学习·rust
传奇开心果编程3 小时前
【Rust入门知识点学与练】第35课:工具链与反馈环——先学会读编译器在说什么
开发语言·学习·rust
优化Henry4 小时前
学习笔记之关于MME不通问题归纳
运维·网络·学习·5g·信息与通信
M78佐菲12 小时前
51单片机学习笔记:ds18b20要点整理
linux·笔记·嵌入式硬件·学习·51单片机