一、嵌入式
嵌入式是以应用为中心、以计算机技术为基础、软硬件可裁剪的专用计算机系统,根据用户需求对功能、体积、成本、环境、可靠性做取舍。
一个嵌入式系统从下到上分三层:
应用层 APP
操作系统 SYS
硬件系统
二、处理器家族先分清
计算机硬件由运算器、控制器、存储器、输入设备、输出设备五部分组成,运算器和控制器合起来就是 CPU。
按用途分的几个常见名词:
CPU(Central Processing Unit):中央处理单元,通用处理器。
GPU(Graphics Processing Unit):图形处理单元,大量并行运算。
FPU(Floating Processing Unit):浮点运算单元,专门算浮点。
NPU(Neural Processing Unit):神经网络处理器。
在嵌入式领域,按集成度和用途又有一组:
MPU(Micro Processing Unit):微处理器,通用型,偏重处理能力,一般要外接内存和存储。
MCU(Micro Control Unit):微控制器,集成度高,偏重控制,常说的"单片机"就是它。
DSP(Digital Signal Processing):数字信号处理器,为高强度数学运算设计的专用芯片。
SoC(System On Chip):片上系统,把 CPU、GPU、外设控制器集成到一块硅片上。
一个容易理解的类比:SoC 就像一张城市蓝图,把市政府(MPU)、公安局(MCU)、研究所(DSP)、机场(调制解调器)都规划在同一块土地上。
i.MX6ULL 就是典型的 SoC:内部除了 Cortex-A7 内核,还有 GPIO、PWM、UART、定时器等一堆外设控制器。
三、RAM 与 ROM
可直接寻址(可以,CPU 直接读写)一般不可被处理器直接寻址
单位容量价格(高)低
掉电(易失(数据丢失))非易失(数据保留)
读写速度(快)慢
四、架构与指令集
常见的架构四大类:X86、ARM、MIPS、RISC-V。
指令集分两大流派:
CISC(Complex Instruction Set Computer):复杂指令集,一条指令干很多事。X86(含 x64)属于这一类。
RISC(Reduced Instruction Set Computer):精简指令集,指令少而规整,靠流水线提效率。ARM、MIPS、RISC-V 属于这一类。
ARM 的指令集版本演进到 v1--v9,不同版本对应的内核型号不同:
Cortex-A(Application):应用处理器,跑 Linux/Android,性能优先。i.MX6ULL 的 Cortex-A7 属于这一类。
Cortex-R(Real-time):实时处理器,硬实时场景。
Cortex-M(Microcontroller):微控制器,低功耗低成本,STM32 用的 M3/M4 就是这一类。
所以"ARM 内核 32 位"指的是寄存器位宽和指令字长是 32 位。
五、寄存器
ARM 有 16 个通用寄存器 R0--R15,其中三个有特殊用途:
R13 = SP(Stack Pointer):栈指针,指向栈顶。
R14 = LR(Link Register):链接寄存器,BL 调用时保存返回地址。
R15 = PC(Program Counter):程序计数器,指向下一条要执行的指令。
这两个状态寄存器要区分:
CPSR(Current Program Status Register):当前程序状态寄存器,含条件标志位(NZCV)、中断屏蔽位、工作模式位。
SPSR(Saved Program Status Register):备份程序状态寄存器,发生异常时保存 CPSR 的值。
六、Cache、MMU 与虚拟内存
Cache(高速缓存):CPU 和内存之间的缓冲,分 I-Cache(指令)和 D-Cache(数据)。它利用程序的局部性,把常用的数据放在离 CPU 更近的地方。裸机阶段通常先关着或按需打开,因为 Cache 和 DMA 一起用会有数据一致性问题。
MMU(Memory Management Unit):内存管理单元,负责把物理地址映射成虚拟地址。关掉 MMU 时 CPU 直接访问物理地址;打开后所有访问都要经过 MMU 的页表转换。
虚拟内存空间的典型布局(以 32 位为例,从高地址到低地址):
0xFFFFFFFF 操作系统内核栈
...
静态区 / 已初始化 / 未初始化
0x00000000 代码段
这套布局在 Linux 程序里天天见到,和后面写链接脚本时划分 .text/.data/.bss 是同一套东西。
七、栈帧与函数调用
函数调用时,每层函数在栈上占一块自己的空间,叫栈帧,里面放局部变量、传进去的参数、返回地址。
main → fun0 → fun1
调用 fun1(0x4000, b) 时,R13(SP) 指向当前栈顶,R14(LR) 保存返回地址 0x3004,R15(PC) 指向 0x3004 之后的指令。fun1 内部再用 STMFD 把现场压栈,就形成了新的一层栈帧。
这也解释了昨天为什么要写保护现场:嵌套调用时 LR 会被覆盖,返回地址必须存在栈里。
八、流水线与总线
三级流水线:取指(Fetch)→ 译码(Decode)→ 执行(Execute)。三条指令同时在流水线的三个段里跑,所以 PC 指向的地址和"正在执行"的指令并不是同一条------写跳转指令时要考虑流水线的影响。
总线:
AHB(Advanced High-performance Bus):先进的高性能总线,挂在高速外设上。
APB(Advanced Peripheral Bus):先进的外设总线,挂在低速外设上。
昨天的时钟树里 AHB 132MHz、IPG 66MHz,就是这个层级关系:内核和内存走高速总线,UART、I2C 这类走低速总线。
九、重点总结
- 嵌入式 = 以应用为中心的专用计算机,软硬件可裁剪,分应用层、操作系统层、硬件层。
- MPU 偏处理、MCU 偏控制、DSP 偏运算、SoC 是集成,四个词不要混用。
- ARM 属于 RISC 阵营,Cortex-A 跑应用、Cortex-R 跑实时、Cortex-M 做控制。
- R13/SP 管栈、R14/LR 存返回地址、R15/PC 指向下一条指令;CPSR 是当前状态,SPSR 是异常时的备份。
- MMU 负责虚拟地址到物理地址的映射,Cache 负责速度差,两者的配置都在 cp15 里。