【嵌入式ARM入门】ARM体系结构学习总结
📖今日学习:嵌入式系统基础、处理器分类、SOC概念、存储器、指令集、ARM32内核寄存器、CPSR、内存映射、AHB/APB总线、栈帧、三级流水线、C程序编译四阶段。
🔍文章大纲
- 嵌入式系统基础概念
- 各类处理器单元(CPU/GPU/FPU/NPU/MPU/MCU/DSP/SOC)
- 存储器 RAM / ROM 详解
- 指令集:CISC 复杂指令集 & RISC精简指令集
- ARM内核分类 Cortex‑A / R / M系列
- ARM32内核内部组成、通用寄存器R0‑R15
- CPSR / SPSR 程序状态寄存器
- 内存映射、AHB、APB总线
- ARM栈帧,函数调用过程sp、lr、pc变化
- ARM三级流水线工作原理
- C语言编译四个阶段
- ✨学习重点
- ⚠️易错点踩坑记录
- 📝学习小结
1. 嵌入式系统基础概念
嵌入式系统定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
嵌入式系统三层软件架构
- 应用层:业务应用程序,实现产品业务逻辑
- 操作系统层:Linux / RT‑Thread / FreeRTOS等操作系统内核,管理软硬件资源
- 硬件层:CPU、内存、外设、电路板硬件平台
冯诺依曼计算机五大硬件组成:
- 运算器:完成算术、逻辑运算
- 控制器:指挥协调各个部件工作
- 存储器:存储程序和数据
- 输入设备:接收外部信息(按键、传感器)
- 输出设备:向外输出信息(LCD、LED、蜂鸣器)
冯诺依曼特点:程序与数据统一存放在存储器中。
2. 各类处理器单元介绍
| 缩写 | 全称 | 功能说明 | 典型应用 |
|---|---|---|---|
| CPU | 中央处理单元 | 通用处理器,负责控制、通用运算 | 电脑、ARM开发板 |
| GPU | 图形处理单元 | 专门处理图像、图形渲染 | 手机显卡 |
| FPU | 浮点运算单元 | 专门处理浮点数float/double运算 | Cortex‑A带FPU,M部分内核不带 |
| NPU | 神经网络处理单元 | AI人工智能运算,深度学习 | 智能手机AI算力 |
| MPU | 微处理器 | 通用处理器,需要外接RAM/ROM,无片上外设 | Cortex‑A系列 |
| MCU | 微控制器(单片机) | CPU+RAM+ROM+外设全部集成芯片内部,高度集成 | 51单片机、STM32 Cortex‑M |
| DSP | 数字信号处理器 | 擅长大量数字信号运算,滤波FFT等 | 音频、通信信号处理 |
| SOC | System‑On‑Chip 片上系统 | 设计理念,把MPU/DSP/GPU、内存控制器、各类外设全部集成在一颗芯片内部 | 手机主芯片 |
重要区分:
- MCU单片机:外设内置芯片,拿来就用;资源有限,一般跑裸机/RTOS。
- MPU微处理器:内核,大部分外设、RAM、Flash需要芯片外部外接;可以跑完整Linux系统。
- SOC不是某一个具体芯片型号,是一种芯片集成架构思想。
3. 存储器 RAM 和 ROM
RAM 随机存取存储器
- CPU可以直接对RAM进行寻址读写;
- 易失性存储器,断电数据全部丢失;
- 读写速度快;硬件成本高,容量一般不会特别巨大;
- 分为SRAM静态RAM、DRAM动态RAM。开发板DDR属于DRAM。
ROM 只读存储器
- CPU不能直接寻址运行ROM内部代码,代码需要拷贝到RAM再执行;
- 非易失存储器,断电数据保存;
- 单位字节成本低,容量可以做很大;读写速度比RAM慢很多。
常见ROM类设备:Nor‑Flash、Nand‑Flash,开发板上存放固件、系统镜像。
补充:ARM开发板启动过程:固件存放在Nand‑Flash(ROM类),上电把代码拷贝到DDR(RAM),再在RAM中运行程序。
4. 指令集架构 CISC / RISC
CISC 复杂指令集
- 代表:X86(PC电脑CPU)
- 特点:指令数目繁多,指令长度不固定;硬件电路复杂。
RISC 精简指令集
- 代表:ARM、RISC‑V、MIPS
- 特点:指令数量少;指令长度全部固定(ARM32位指令4字节);硬件设计简单,低功耗,非常适合嵌入式设备。
ARM内核三大系列:
- Cortex‑A系列:应用处理器,带MMU,支持运行完整Linux系统;手机、嵌入式开发板。
- Cortex‑R系列:实时处理器,高实时性,用于汽车电子工业控制,无MMU。
- Cortex‑M系列:微控制器内核,单片机内核,无MMU;裸机、RTOS,STM32。
MMU内存管理单元:只有带MMU的Cortex‑A才能使用虚拟内存,运行完整Linux;Cortex‑M/R没有MMU,只能操作物理地址。
5. ARM32位内核内部结构
ARM32:机器字长32位,CPU一次处理4字节数据。
内核主要组成部分:
- 通用寄存器R0~R15 (16个32位通用寄存器)
|寄存器 |别名 |作用 |
|---|---|---|
|R0‑R12 |通用寄存器 |用于临时保存运算数据;R0‑R3函数传参 |
|R13 |SP |栈指针,永远指向栈顶 |
|R14 |LR(Link Register) |链接寄存器,保存函数返回地址 |
|R15 |PC(Program Counter) |程序计数器,保存取指的内存地址 |
ARM流水线影响:PC的值 = 当前执行指令地址 + 8字节。面试高频考点!
- ALU算术逻辑单元:完成加减、逻辑与或非运算。
- I‑Cache 指令高速缓存;D‑Cache数据高速缓存。
Cache解决CPU速度远大于内存访问速度的矛盾,缓存热点指令和数据,提升运行速度。
- MMU内存管理单元:虚拟地址 ↔ 物理地址转换,内存权限管理。
- CPSR 当前程序状态寄存器;SPSR备份程序状态寄存器。
CPSR / SPSR 程序状态寄存器
CPSR:32位寄存器,记录程序运行状态。
- 条件标志位N Z C V,ALU运算结果会自动修改标志位,用于if判断、跳转。
- 控制位:中断总开关I、F;处理器工作模式位。
SPSR:备份状态寄存器。发生异常中断时,保存CPSR现场;异常返回,把SPSR恢复回CPSR。普通程序模式不能访问SPSR。
ARM7有7种处理器工作模式:用户模式、FIQ、IRQ、管理模式、中止、未定义、系统模式。发生异常自动切换模式。
6. 内存映射与总线 AHB / APB
ARM外设(GPIO、UART、定时器)寄存器全部映射到内存地址空间。访问这个地址等价于操作外设寄存器。
总线分类
总线分为三类:
- 地址总线:传递要访问的内存/寄存器地址
- 数据总线:传输读、写的数据
- 控制总线:传输读写、使能等控制信号
开发板两套常用片上总线:
- AHB 高性能先进总线:高速总线,内核、DDR内存控制器,高速外设挂载AHB。
- APB外设总线:低速外设总线,GPIO、UART、I2C、SPI挂载APB。
AHB总线通过桥接模块转换到APB总线。
内存地址空间分区:
- DDR(RAM)区域:存放程序代码、全局变量、堆、栈。
- 外设寄存器地址段:各个片上外设寄存器映射地址。
- Flash控制器地址区间。
7. ARM栈帧,函数调用机制
ARM栈:满递减栈,栈从高地址向低地址方向增长,SP(R13)指向栈顶有效数据。
栈帧:每调用一个函数,就在栈上面开辟一块独立内存区域,叫做栈帧。栈帧保存:局部变量、寄存器现场、函数返回地址LR。
函数调用完整流程示例 main调用funcA,funcA调用funcB:
- main调用funcA,把返回地址存入LR寄存器。
- SP向低地址移动,开辟funcA栈帧,保存局部变量。
- funcA调用funcB,再次更新LR,SP继续减小开辟funcB栈帧。
- funcB执行完毕,从LR拿到返回地址,回到funcA;释放funcB栈帧,SP恢复。
- funcA执行完成,返回main,释放funcA栈帧。
重点:
- SP(R13)永远指向栈顶,栈向下(低地址)扩张。
- LR(R14)保存下一条返回指令地址,不是当前函数地址。
- PC(R15)指向即将取指的指令。
8. ARM三级流水线(ARM7)
流水线目的:提升CPU指令吞吐率,多条指令重叠并行处理 。
三级流水线三个阶段:
- 取指(Fetch):从内存读取指令
- 译码(Decode):解析指令,确定要做什么运算
- 执行(Execute):ALU执行运算
同一时刻,三条指令分别处于不同流水线阶段。
例:第1条指令执行,第2条译码,第3条取指,并行工作。
⚠️注意:流水线不是多条指令同时全部执行完毕,只是阶段重叠。
因为流水线,ARM32中PC = 当前正在执行指令地址 + 8字节,面试经常考察。
9. C语言编译四个阶段
gcc编译C程序分为4个步骤:预处理 → 编译 → 汇编 → 链接
bash
#1.预处理:处理# include #define #ifdef,展开头文件、宏替换,生成.i文件
gcc -E test.c -o test.i
#2.编译:C语言翻译成汇编语言.s
gcc -S test.i -o test.s
#3.汇编:汇编转成机器码目标文件.o
gcc -c test.s -o test.o
#4.链接:把多个.o目标文件、系统库合并,生成可执行程序
gcc test.o -o test
- 预处理:只处理#开头内容,不做语法检查。
- 编译阶段:做C语言语法检查,报错大多在此阶段。
- 汇编:把汇编翻译成二进制机器码。
- 链接:合并段,解析符号,分配内存地址。
✨学习重点
- 嵌入式系统三层架构,冯诺依曼五大硬件部件;理解嵌入式软硬件可裁剪的特点。
- 分清MCU、MPU、DSP、SOC概念:SOC是芯片集成设计理念,MCU单片机内置全部外设,MPU需要外接内存Flash。
- RAM断电丢失、ROM断电保存;ARM开发板上电把Flash(ROM)镜像拷贝到DDR(RAM)运行。
- RISC精简指令集ARM,指令定长;CISC复杂指令集X86。Cortex‑A带MMU跑Linux;M/R无MMU。
- ARM32寄存器:R13(SP栈顶)、R14(LR返回地址)、R15(PC程序计数器);流水线导致PC值=当前执行指令+8字节。
- CPSR保存运算标志位与处理器模式;SPSR异常模式用来备份CPSR。
- AHB高速总线,APB低速外设总线;外设寄存器全部内存映射,访问地址等于操作硬件。
- ARM栈:满递减栈,由高地址向低地址增长;栈帧概念,函数调用时SP、LR、PC配合工作。
- ARM7三级流水线:取指‑译码‑执行,提升指令吞吐。
- gcc编译四阶段,每个阶段对应的gcc参数
‑E ‑S ‑c,每个阶段做什么事情。
⚠️易错点 & 踩坑记录
- ❌认为SOC是某一款芯片。✅SOC是片上系统的设计思想,不是单个芯片型号。
- ❌混淆MCU与MPU:MCU(STM32/51)片内自带RAM Flash外设;MPU(Cortex‑A)必须外部接DDR、Flash。
- ❌ROM可以直接运行程序:ARM不能直接在NandFlash运行程序,必须拷贝进RAM再运行。
- ❌ARM栈方向记反:ARM满递减栈,栈向低地址增长,SP指向栈顶,不是栈底。
- ❌PC寄存器等于当前正在执行指令地址。✅流水线:
PC = 当前执行指令地址 + 8。 - ❌SPSR可以在用户模式随便读写:SPSR只有异常模式才可以访问,普通用户模式无法读取。
- ❌AHB接串口、I2C低速外设:低速外设挂载APB总线;AHB给内核、DDR控制器。
- ❌流水线理解错误:流水线不是多条指令同时全部执行完成,只是各个阶段重叠。
- ❌gcc参数混淆:
‑E预处理,‑S生成汇编,‑c只汇编不链接;很多同学把‑c当成生成可执行程序。 - ❌Cortex‑M内核想跑Linux:M内核没有MMU,无法运行标准Linux,只能裸机/RTOS。
📝学习小结
今天学习ARM嵌入式底层体系,从嵌入式系统基础、各类处理器、存储器,再到RISC指令集,ARM32内核寄存器、CPSR状态寄存器;理解内存映射、AHB/APB总线;掌握ARM栈帧、函数调用寄存器变化;ARM7三级流水线;C语言gcc编译完整四个阶段。