前言
最近在系统学习嵌入式 ARM 体系结构,整理了一份完整的学习笔记,涵盖嵌入式基础概念、各类处理器区别、SOC、总线、MMU、寄存器、内存布局、函数栈帧、编译流程、三级流水线等核心知识点,适合嵌入式、Linux C 开发新手入门。
嵌入式定义:以应用为中心,以计算机技术为基础,软硬件可剪裁的专用计算机系统,设计时需要考虑功耗、体积、环境、稳定性、可靠性等需求。
计算机系统分为硬件系统 + 软件系统;硬件五大核心部件:运算器、控制器、存储器、输入设备、输出设备。
一、各类处理器概念区分
很多初学者容易混淆 CPU、GPU、FPU、NPU、MPU、MCU、DSP、SOC,这里一次性理清:
- CPU 中央处理器:通用处理器,负责逻辑与控制运算。
- GPU 图形处理单元:面向图像并行计算。
- FPU 浮点运算单元:专门处理浮点数运算。
- NPU 神经网络处理器:面向 AI 推理。
嵌入式领域常用:
- MPU 微处理器:通用型,偏向处理,需要外接内存。
- MCU 微控制器:集成度高,偏向控制,就是我们常说的单片机(单片微型计算机系统)。
- DSP 数字信号处理器:专为高强度数学运算设计,适合信号处理。
- SOC 片上系统:把 MPU、MCU、DSP、外设控制器全部集成在一块芯片上,相当于在芯片内部搭建一套完整计算机系统。
SOC 内部可以集成内核、GPIO、PWM、UART、定时器、硬盘控制器等外设。
二、存储器:RAM 和 ROM
表格
| 类型 | 特点 |
|---|---|
| RAM(随机访问存储器) | 1. 可被 CPU 直接寻址2. 单位空间成本高3. 易失性,断电数据丢失4. 读写速度快 |
| ROM(只读存储器,如 nor flash) | 1. 一般不能直接被处理器寻址2. 单位存储价格低3. 非易失性,断电保存数据4. 读写速度慢 |
简单理解:ROM 存放固件、程序代码;RAM 作为运行内存,程序运行时代码会加载到 RAM 中执行。
三、指令集架构:CISC 与 RISC
- CISC 复杂指令集:X86、X86_64,指令多、长度不等,PC 电脑使用。
- RISC 精简指令集:ARM、MIPS、RISC-V,指令少、定长指令,嵌入式、移动端主流。
ARM 内核版本:ARM1~ARM11;Cortex 系列分为三类:
- Cortex‑A:应用处理器(MPU,跑操作系统,手机、开发板)
- Cortex‑R:实时性内核
- Cortex‑M:微控制器内核(MCU,单片机)
ARM32 位系统,机器字长 4 字节。
四、ARM 内核硬件核心组件
1. 核心部件
- ALU 算术逻辑单元:负责加减、与或非等算术、逻辑运算。
- Cache 高速缓存:分为 iCache(指令缓存)、dCache(数据缓存),用来缓解 CPU 和内存之间的速度差。
- MMU 内存管理单元:完成物理内存 ↔ 虚拟内存地址转换;关闭 MMU 时,虚拟地址直接等于物理地址。
- 总线:32 根数据总线、32 根地址总线,外加若干控制总线。
2. ARM 32 位核心寄存器
ARM 有一组通用寄存器,重点记住几个特殊功能寄存器:
- R13 (sp) 栈指针寄存器:指向当前栈顶。
- R14 (lr) 链接寄存器:保存函数调用的返回地址。
- R15 (pc) 程序计数器:保存下一条要执行指令的地址。
- CPSR 当前程序状态寄存器:保存当前程序运行状态(标志位:正负、零、溢出、中断屏蔽等)。
- SPSR 备份程序状态寄存器:异常发生时备份 CPSR 的值,异常返回时恢复。
五、内存布局:虚拟内存空间
开启 MMU 之后,操作系统给程序提供虚拟地址空间,从0x00000000 ~ 0xFFFFFFFF,地址空间划分:
- 代码段:存放编译后的程序指令,只读。
- 静态区:全局变量、静态变量。
- 已初始化 / 未初始化段:bss 段。
- 堆区:malloc 动态申请内存,自下往上增长。
- 栈区:函数局部变量、函数栈帧,从上往下增长。
- 内核空间:操作系统内核,外设寄存器映射到该地址空间(GPIO、PWM 等外设)。
ROM (nor flash) 存放固件,上电后把代码拷贝到 RAM,CPU 从 RAM 中读取指令运行。
六、函数调用与栈帧(重点!)
函数调用时,会在栈上创建栈帧,这是面试高频考点。 以main调用fun1,fun1调用fun0为例:
- 进入 main 函数,在栈上创建 main 栈帧,保存局部变量 a、b。
- 调用
fun1(a,b),lr 寄存器保存返回地址,切换到 fun1 栈帧,分配局部变量 sum。 - fun1 继续调用 fun0,再次压栈,创建 fun0 栈帧。
- 函数 return 返回时,通过 lr 回到上一层函数,释放当前栈帧,sp 栈指针回退。
栈底在高地址,栈顶在低地址;栈由高地址向低地址增长。
七、gcc 编译四阶段(C 语言源码 → 可执行文件)
# 1.预处理:头文件展开、宏替换,生成.i文件
gcc -E main.c -o main.i
# 2.编译:翻译成汇编代码,生成.s汇编文件
gcc -S main.i -o main.s
# 3.汇编:汇编转为机器目标文件 .o
gcc -c main.s -o main.o
# 4.链接:把多个.o + 系统库链接,生成可执行程序
gcc main.o -o main.out
- 预处理:去掉注释,展开
#include,替换#define宏。 - 编译:C 语法检查,生成汇编。
- 汇编:汇编指令转二进制机器码。
- 链接:合并多个目标文件,解析符号,生成可执行文件。
八、ARM 三级流水线
ARM 经典三级流水线:取指 → 译码 → 执行 流水线可以并行工作:同一时刻,第一周期的指令在执行,第二条在译码,第三条正在预取,以此提升 CPU 指令吞吐率。
流水线的核心目标:提高指令执行效率,让 CPU 尽可能不停工。
九、片上总线
- AHB:高级高速总线,连接内核、内存等高速设备。
- APB:高级外设总线,连接 GPIO、UART、定时器等低速外设。
小结
本篇笔记覆盖嵌入式 ARM 入门最核心的知识点:嵌入式系统定义、SOC、存储、RISC/CISC、ARM 寄存器、MMU 虚拟内存、内存分区、函数栈帧、gcc 编译流程、三级流水线。 这些知识点是学习 Linux 嵌入式、驱动开发、QT 上位机、单片机底层的基础。理解栈帧、MMU、寄存器,后面学习中断、异常、操作系统底层会轻松很多。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Q3365879/article/details/165491444



