ARM裸机学习1——ARM体系架构
本文对比了51单片机与ARM架构的主要差异:51采用8位CISC架构,适合简单控制;ARM采用32位RISC架构,具有更高性能和低功耗特性。ARM内核分为A(应用处理器)、R(实时控制)、M(微控制器)三大系列,采用多总线结构和哈佛架构。开发时需注意关闭MMU、启用指令缓存等关键设置。文章还详细介绍了ARM的寄存器结构、7种工作模式、异常处理流程以及编译工具链等核心概念,为嵌入式开发提供了基础理论
目录
底层开发三阶段:
1、从51单片机到ARM
1.1 51单片机与ARM平台的异同
主要体现在以下方面:
-
内核架构:51单片机采用8051内核,属于CISC(复杂指令集计算机),指令丰富但效率较低;ARM平台使用RISC(精简指令集)架构,指令精简、执行高效,更适合高性能与低功耗场景。芯片的区别最主要是内核(kernel)的区别
典型的SOC处理器内核
- SOC概念:System on Chip,r简称Soc,也即片上系统。
- 典型的SOC处理器内核
- 8051
- DSP:用于浮点运算
- MIPS
- x86
- PPC:上世纪90年代使用的
- ARM:嵌入式用得最多(付费)
- RISC-V:和ARM类似,但免费开源
8051:
ARM内核:
-
位宽与寄存器:51为8位架构,寄存器宽度为8比特;ARM(我使用的A7内核)为32位架构,通用寄存器(R0–R12)均为32位,数据处理能力更强。
-
系统结构:51单片机通常集成少量外设(如GPIO、定时器),程序直接操作硬件寄存器;ARM平台多为SoC(片上系统),内核与外设分离,需通过控制器访问内存与外设,支持更复杂的操作系统与多任务调度。
-
应用场景:51适用于简单控制类任务(如家电、小规模嵌入式);ARM广泛用于智能手机、汽车电子、工业控制等高性能领域,其A系列用于应用处理器,M系列用于微控制器(如STM32)。
-
开发方式:51编程多直接操作寄存器;ARM开发需先编写汇编启动代码初始化栈(SP)、链接寄存器(LR)、程序计数器(PC)等核心部件,才能进入C语言环境运行。
1.2 ARM概念
- ARM概念:①ARM公司(商业模式:负责设计内核并授权)②ARM(Advanced RISC Machine )系列处理器内核
- 芯片内核分类——主要根据指令集架构分为两大类
重要概念:
指令:能够指示处理器执行某种运算的命令称为指令(如加、减),指令在内存中以机器码(二进制)的方式存在。
指令集:指令的集合,不同架构的处理器指令集不同。指令是CPU留给程序员的接口。
程序:是指令的有序集合
- CISI: Complex Instruction Set(集合) Computer 复杂指令集计算机 (如x86架构CPU)
- 优点:指令丰富、功能强大,一条指令可完成多个操作
- 缺点:芯片面积大、加工成本高、实现复杂、体积大、功耗大(二八效应:80%情况下只用到了20%功能)
- 应用场景:适用于高性能计算场景
- 典型代表:x86(如英特尔、AMD的桌面与服务器处理器)
- RISC: Reduced Instruction Set Computer 精简指令集计算机
- 优点:芯片面积小、加工成本低、实现简单、体积小、功耗小,大量使用寄存器(大多数数据操作都在寄存器中完成),指令执行速度更快;
- 应用场景:适合嵌入式与移动设备,如手机、平板、单片机、嵌入式设备
-
典型代表:ARM(如手机、STM32单片机)、MIPS(如早期华为路由器)、8051(51单片机内核)。
-
ARM的指令集 :armv1 -armv8
-
imx6ull -> Cortex A7 -> armv7
-
S3C2440(三星的) ->ARM9 20T -> armv4
-
exnoy4412 -> CoitexA8 > armv8
-
此外,ARM公司进一步将RISC架构的内核按应用场景细分为三大系列:
| ARM系列处理器内核发展历程 | ||
| ARM经典系列 | ——> | Cortex三大系列(A/R/M) |
| ARM1 ~ ARM11 |
A系列(Application): 应用级-跑系统(安卓 / Linux) 应性能应用,如智能手机(华为麒麟、苹果A系列芯片)(如imx6ull 是Cortex-A7内核,32位) |
|
| R系列(Real-time): 用于实时控制- 汽车电子、航空航天 | ||
| M系列(Microcontroller):用于微控制器,MCU 单片机领域(如STM32系列M3/M4/M7等) | ||
1.3 ARM内核的关键组成
- CortexA7内核(32位)资源

- 寄存器
- 概念:寄存器是处理器内部的存储器,没有地址
- 作用:一般用于暂时存放参与运算的数据和运算结果
- 分类:
- 通用寄存器——R0-R12:想存什么存什么,没用限制
- 专用寄存器——R13-R15:规定了只能存储的内容
- 控制寄存器——负责模式切换,如cpsr,spsr
- ARM中,经典系列的寄存器数量——37个;cortex系列中的寄存器数量——40个
- 注:在某个特定模式下只能使用当前模式下的寄存器,一个模式下特有的寄存器其他模式下不可使用
- ALU: Arithmetic Logical Unit,算术逻辑单元

- PC寄存器:program counter ,程序计数器,本质上是一个指针,指向当前代码正在执行指令的下一条指令
- Lr寄存器:Linked register,链接寄存器,保存函数返回地址(函数调用完跳回哪里)
- sp寄存器:stack pointer,栈指针寄存器,管理栈区,永远指向栈顶
- Cache:高速数据缓存,直接从Cache访问数据,提高CPU访问数据的效率
- icache: instruction cache,指令缓存, 存指令(加速取代码)
- dcache: data cache,数据缓存,存数据(加速读数据)
- 裸机开发黄金规则:必须要关闭MMU(裸机阶段使用物理内存,用不到虚拟内存),打开icache,关闭dcache
1.4 ARM构成的SOC
- ARM最小系统:
- 概念:使系统能够正常工作的最少器件构成的系统
- 图示:

- 总线通信(芯片内部 “高速公路”):
- 单总线通信:通过一根线/一组线和外设通信,同一时间只能和一个设备通信(排队)
- 双总线通信:
- AHB总线:advanced high bus,先进高速总线,连接高速外设(USB、网卡、RAM、北桥芯片)(跑得快)
- APB总线:先进外设总线(GPIO、UART、蓝桥芯片)(慢但够用)
- 三总线结构:
DMA(Direct Memory Access):即直接存储器访问,使用DMA总线可以不通过CPU直接在存储器之间进行数据传递
- 多级存储结构:目的是为了兼顾速度、容量、价格
51单片机:一级存储
ARM:三级存储。高端的芯片都是多级存储
Cache 速度最快、价格最贵、容量最小、断电数据丢失、cpu可直接访问
存储当前正在执行的程序中的活跃部分,以便快速地向CPU提供指令和数据主存储器
速度、价格、容量介于Cache与辅存之间、断电数据丢失、cpu可直接访问
存储当前正在执行的程序和数据辅助存储器
速度最慢、价格最低、容量最大、断电数据不丢失、cpu不可直接访问存储暂时不运行的程序和数据,需要时再传送到主存
- 三级流水线结构(指令流水线)(同时做三件事,大大提高CPU工作效率)
通过指令的并行处理提升执行效率:当一条指令处于执行阶段时,下一条指令完成译码,第三条指令进入预取阶段,实现单周期指令的高效执行。高级 ARM 内核进一步扩展为五级、八级流水线,以优化指令吞吐量,本质上都是三级流水线结构的细分。
- PC :取指令
- 译码器:解释
- kernel:执行指令
- 字节序:一般来说,ARM是小端对齐
- 计算机架构
- 冯.诺依曼架构:数据和指令存放在同一片内存空间
- 哈佛架构:指令、数据分开存储(速度更快,ARM / 单片机常用)
- SATA:古老的硬盘接口
- 启动相关
- BIOS:引导Windows系统启动,把操作系统从flash搬运到内存
- bootloder:引导Linux系统启动的程序
- 多核处理器结构:
单核CPU:时间片轮转实现多线程
多核CPU:不同的线程可以运行在不同的核心中,做到真正的并发
多核处理器结构:即一个SOC中集成了多个CPU核,共用外设与接口资源
2、 ARM裸机开发基础
2.1编译
概念:从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级 语言或机器语言)的翻译过程。
编译原理:
• 不同处理器指令集不一样,所以相同指令(如加法指令)的机器码也可能不一样,所以机器码不可移植• 汇编语言本质:用符号代替机器码,与机器语言一一对应,所以不同的处理器汇编也不一样,所以虽然解决了阅读性的问题,但也不可移植• 高级语言:解决了移植性问题 —— 原因:其实不是语言而是编译器解决了问题,编译成不同架构的汇编![]()
- 编译器:用于编译的软件。
- 编译4流程:预处理(Pre-Processing),编译(Compliling),汇编(Assembling),链接(Linking)

- 开发ARM程序常用的集成开发环境
- 编译器
- 本地编译器:gcc 用于x86架构(比如gcc main.c -o app)
- 交叉编译器:arm-linux-gnueabihf-gcc 用于arm架构,交叉编译 ARM 程序 (uname -a 查看处理器架构)(比如arm-linux-gnueabihf-gcc main.c -o app_arm)
- 编译器
交叉编译(Cross Compile):在宿主机(比如你的 x86 Windows/Linux 电脑)上,编译出能在目标机(ARM 开发板、单片机、手机、路由器等)上运行的程序。
- keil4:用于仿真,学习内核(S3C2440仿真模拟ARM920T)
2.2 ARM数据类型(32 位架构标准)
——ARM可以直接处理以下三种数据类型(64位处理器才可以直接处理Doubleword)
- ARM 约定:
Byte : 8 bits
Halfword :16 bits (2 byte)
Word :32 bits (4 byte)
Doubleword :64-bits(8byte)(Cortex-A处理器)- 注意:数据本身是多少位在内存存储时就应该多少位对齐
- Word型数据在内存的起始地址必须是4的整数倍
- Halfword型数据在内存的起始地址必须是2的整数倍
2.3 ARM指令类型
- 大部分ARM core 提供:
- ARM指令集(32-bit)
- Thumb指令集(16-bit)(压缩指令,省空间)
- Cortex-A处理器
- 16位和32位Thumb-2指令集:混合 16/32 位(现代 ARM 用)
- 16位和32位ThumbEE指令集
- Jazelle cores 支持 Java bytecode
2.4 处理器工作模式
分模式的原因:满足不同场合的需求,不同模式完成不同功能
工作模式的理解:不同模式拥有不同权限;不同模式执行不同代码;不同模式完成不同的功能
- ARM有7个基本工作模式(最后边两种是cortex内核才有的模式)
- User:非特权模式,大部分任务执行在这种模式(权限最低)
- FIQ:当一个高优先级(fast)中断产生时将会进入这种模式
- IRQ:当一个低优先级(normal)中断产生时将会进入这种模式
- SupQervisor:管理员模式、默认模式,当复位或软中断指令执行时将会进入这种模式
- Abort:当存取异常时将会进入这种模式()
- Undef:当执行未定义指令时会进入这种模式
- System:特权模式、使用和User模式相同寄存器集的特权模式Cortex-A
- Cortex-A特有模式: 用于调试——专用安全模式
- Monitor:是为了安全而扩展出的用于执行安全监控代码的模式;也是一种特权模式——专用安全模式
- ARM复位后模式为SVC,状态为ARM状态(使用的是ARM的指令集)
- 切换处理器工作模式

- ARM寄存器个数
- ARM有37个32-Bits长的寄存器:1 个用作PC( program counter)、1个用作CPSR(current program status register)、5个用作SPSR(saved program status registers)、30个通用寄存器)
- Cortex体系结构下有40个32-Bits长的寄存器
2.5 异常处理机制
异常的概念:
处理器在正常执行程序的过程中,可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序例如:音量±。因为CPU不知道你啥时候±音量
异常处理的本质:
处理异常其实就是处理另一段程序,这段异常处理程序也是我们写的
异常处理机制:
异常源:
概念:导致异常产生的事件称为异常源
ARM异常源:ARM只认这七类异常
重要区分:
①7类异常与8种工作模式名字上有交集,但是不是一个概念
异常源有七类,但是与异常相关的工作模式只有5个——即只要出现7类异常中的一类,就会进入5种工作模式中的一种
②异常(Exception)和中断(Interrupt)的区别:两者常经常被混为一谈,因为本质上它们在硬件执行层面是高度相似的,处理流程都是“保存现场 -> 跳转 -> 处理 -> 恢复现场 -> 返回”。但是在严格的计算机体系结构定义(特别是像我正在学的 Cortex-A7 这种 ARM 架构)中,它们有明确的区分和包含关系。在 ARM/Cortex-A 架构中,异常(Exception)是统称。中断(Interrupt)只是异常的一种类型。
异常 (Exception) = 所有突发事件的统称
- 为了区分,我们把 由外部硬件触发(如按键) 的叫 中断 (Interrupt)。
- 把由指令执行或内部错误触发(如除 0、SWI 指令)的叫异常 (Exception)。
异常模式:
在ARM的基本工作模式中有5个属于异常模式,即ARM遇到7类异常中的一类后会自动切换成5个异常模式中的一种以处理异常

异常处理流程:
- 当异常产生时,产生ARM异常响应(自动完成以下设置)
- 异常返回(软件恢复,这里的代码需要自己写):
举例:
注:异常处理的所有硬件动作与软件恢复操作仅能在 ARM 态执行。
异常向量表:
异常向量表:
异常类型 偏移量 触发场景 Reset(复位) 0x00 系统上电或复位时触发 Undefined Instruction(未定义指令) 0x04 执行未定义指令时触发 Software Interrupt(软中断) 0x08 执行 SWI 指令时触发(如系统调用) Prefetch Abort(预取中止) 0x0C 指令预取时内存访问异常触发 Data Abort(数据中止) 0x10 数据访问时内存异常触发 Reserved(保留) 0x14 预留未使用 IRQ(普通中断) 0x18 低优先级外设中断触发 FIQ(快速中断) 0x1C 高优先级外设中断触发 为什么要有异常向量表
- 因为异常产生时,异常响应中PC是ARM自动设置的,因为你的异常处理程序可能在内存任意位置,硬件怎么知道哪个是呢?所以要通过异常向量表间接把异常处理函数地址给pc,在异常向量表相应的异常位置,可以将你写的异常处理程序首地址给PC寄存器
异常向量表的认识
- 异常向量表的本质是内存中的一段代码
- 表中为每个异常源分配了四个字节的存储空间
- 遇到异常后处理器自动将PC修改为对应的地址
- ARM的异常向量表的基地址默认在0x00地址,一共32个字节,只有cortexA处理器的异常向量列表(这个32字节的表)可以放到任何位置,但是这个过程比较复杂,需协处理器
异常优先级:

3、内存管理
3.1MMU内存管理单元:
内存管理单元(MMU)实现虚拟地址到物理地址的映射,为每个进程分配独立的虚拟地址空间,避免地址冲突。提升系统安全性与内存利用率。
3.2 内存分类
- RAM(随机访问存储器):易失性存储,读写速度快,支持直接寻址,如 DDR 内存
- ROM(只读存储器):非易失性存储,读写速度较慢,通常不可直接寻址.
flash闪存(ROM):新一代非易失性存储器
- nor flash:可位寻址
- nand flash:不可位寻址。如eMMC,是SD卡。不同之处在于eMMC通常是以芯片的形式出现的。
3.3 程序内存分配
程序运行时,内存划分为多个功能区域:

4、核心总结
①复杂指令集与精简指令集
②ARM版本:ARM 经典 → Cortex-A/R/M
③16个通用寄存器,cpsr,spsr,MMU,cache缓存,
③裸机阶段:必须要关闭MMU,打开icache,关闭dcache
④单总线,多总线
⑤flash闪存,新一代非易失性存储器
nor flash:每个字节可寻址
еMMC nand fkash:以块为单位寻址
⑥ARM7种工作模式
⑦ARM寄存器个数——ARM有37个32-Bits长的寄存器、Cortex体系结构下有40个32-Bits长的寄存器
⑧异常处理流程
更多推荐














所有评论(0)