学习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. 异常处理分为硬件自动保存现场,以及软件恢复现场两个阶段。

    。

相关推荐
kyrie_sakura27 分钟前
大模型学习17 大模型学习 - LangChain1_概述
学习
程序猿乐锅1 小时前
【从0-1学习Python | 第九篇】继承
开发语言·后端·python·学习·fastapi
海绵宝宝转agent1 小时前
leetcodehot100个人题解
java·笔记·学习·算法
学长毕设12 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
小小de风呀15 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
李某学编程15 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
Song_RsHt16 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
~kiss~19 小时前
PRO-LONG: Programmatic Memory Enables Long-Horizon Reasoning 程序式记忆赋能长程推理
学习
程序猿编码19 小时前
不依赖 vLLM/llama.cpp:一套面向学习的 DeepSeek-R1 CUDA 推理实现
c++·学习·语言模型·llama·vllm·大模型推理
ms72wx20 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker