一、嵌入式系统硬件组成
一个完整的嵌入式系统由以下五大核心部分构成:

|-------------------|----------------------|-----------------------------|
| 组成部分 | 作用 | 典型器件 |
| CPU (处理器) | 执行指令,完成运算和控制 | ARM Cortex-A/M/R,DSP,FPGA |
| RAM (内存) | 运行时存放变量、堆栈、临时数据,断电丢失 | SRAM、DRAM、SDRAM、DDR |
| Flash/ROM | 存放程序代码和固化数据,断电不丢失 | NOR Flash、NAND Flash、EEPROM |
| 时钟(晶振) | 为CPU和外设提供精准时间基准 | 有源晶振、无源晶振 |
| 复位电路 | 系统上电或异常时将CPU恢复到初始状态 | RC复位、电源监控芯片 |
| 外设 | 与外界交互的输入输出模块 | GPIO、UART、ADC、LCD、定时器等 |
1.1 存储器层次结构(速度 vs 成本)

|--------|-------------|----------|--------|------------------------------|
| 层级 | 类型 | 速度 | 成本 | 说明 |
| 最快 | 寄存器 | ~1个时钟周期 | 最贵 | CPU内部,数量极少(约16个) |
| 次快 | Cache(缓存) | 数个时钟周期 | 贵 | I-Cache(指令缓存)+ D-Cache(数据缓存) |
| 中等 | RAM(内存) | 几十个时钟周期 | 适中 | 程序运行时使用,断电丢失 |
| 最慢 | ROM / Flash | 百个以上时钟周期 | 便宜 | 程序和数据持久化存储,断电不丢失 |
1.2 RAM 分类
|----------------|------------------------|
| 类型 | 特点 |
| SRAM (静态) | 速度极快,功耗高,用于Cache;不需要刷新 |
| DRAM (动态) | 需要定期刷新,密度高,成本低 |
| SDRAM (同步) | 与系统时钟同步,比普通DRAM快 |
| DDR | 在时钟上升沿和下降沿各传一次数据,带宽翻倍 |
1.3 ROM 分类
|--------------|--------------------------------|
| 类型 | 特点 |
| ROM | 只读存储,掉电数据不丢失 |
| PROM | 可编程一次,之后只读 |
| EPROM | 紫外线可擦除,可重复编程 |
| EEPROM | 电信号可擦除,更方便,寿命有限 |
| Flash 闪存 | 访问速率快,掉电不丢失,是EEPROM的改进版,嵌入式最常用 |
二、CPU 类型与 SOC 架构
2.1 主要处理器类型
|----------|----------|-------------------------------------|
| 缩写 | 全称 | 特点与应用 |
| CPU | 中央处理器 | 通用计算,高性能,PC/服务器核心 |
| MCU | 微控制器 | 集成CPU+RAM+ROM+外设,成本低,如51单片机、STM32 |
| MPU | 微处理器 | 只有CPU,需外接RAM/ROM,可跑Linux,如树莓派、i.MX6 |
| DSP | 数字信号处理器 | 专门优化乘加运算(MAC),用于音频/图像处理 |
| FPGA | 现场可编程门阵列 | 硬件可编程,逻辑灵活,延迟极低,用于通信/加速器 |
| SOC | 片上系统 | 将CPU+内存控制器+外设控制器集成一块芯片,如手机芯片 |
2.2 ARM 处理器系列
|--------------|-------------------------|-------------------------------|
| 系列 | 定位 | 典型应用 |
| Cortex-A | 消费电子,高性能,低功耗,支持MMU和虚拟内存 | 手机、平板、机顶盒,可运行 Linux / Android |
| Cortex-R | 实时性强 | 汽车安全系统、工业控制、硬盘控制器 |
| Cortex-M | 高性能偏控制,面积小,低功耗 | 嵌入式单片机(STM32等),IoT设备 |
|------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| RISC vs CISC | RISC(精简指令集):ARM、MIPS、RISC-V。指令少且等长,执行速度快,适合流水线,编译器负担重 CISC(复杂指令集):x86(Intel/AMD)。指令多且变长,单条指令功能强,硬件复杂 ARM 采用 RISC 架构,每条指令固定32位(Thumb模式16位),便于流水线实现 |
2.3 SOC 内部总线结

|------------------|--------------------------|
| 总线类型 | 特点 |
| AHB (高速总线) | 连接CPU、内存控制器、DMA等高速模块 |
| APB (外设低速总线) | 连接UART、GPIO、定时器等低速外设,功耗低 |
| 地址总线 | 单向,CPU发出内存地址 |
| 数据总线 | 双向,传输读写的数据 |
| 控制总线 | 传输读写使能、忙信号等控制信号 |
三、CPU 内部架构
3.1 冯诺伊曼 vs 哈佛结构
|------------|-----------|----------------------------|
| 架构 | 特点 | 代表 |
| 冯诺伊曼结构 | 数据和指令一起存放 | x86 PC、早期单片机(51) |
| 哈佛结构 | 数据和指令单独存放 | ARM(I-Cache/D-Cache分离)、DSP |
3.2 流水线(Pipeline)
流水线: 取指 ,解码, 执行,大幅提高指令吞吐率。
|-----------------|---------------------|
| 阶段 | 说明 |
| 取指(Fetch) | 从 Flash/Cache 中读取指令 |
| 解码(Decode) | 分析指令类型、操作数、目标寄存器 |
| 执行(Execute) | ALU 完成运算或访问内存 |
|---------------|-------------------------------------------------------------------------------------------------|
| 流水线与PC的关系 | ARM 三级流水线下,PC 寄存器指向的是「当前执行指令的下下条」(超前2条)。这就是为什么程序中读取 PC 时得到的值 = 当前指令地址 + 8(ARM模式)或 + 4(Thumb模式)。 |
四、ARM 寄存器详解

五、栈(Stack)
栈是一块连续内存区域,用于存储局部变量、函数参数、返回地址等,遵循 LIFO(先出后出)原则。

六、ARM 工作模式(7种)
ARM 处理器共有 7 种工作模式,通过 CPSR 寄存器的 M[4:0] 字段标识。不同模式拥有独立的寄存器组。

七、程序状态寄存器 CPSR
CPSR(Current Program Status Register)是 ARM 最重要的状态寄存器,32位,记录当前CPU运行状态。

八、异常处理机制
8.1 异常向量表
ARM 在固定地址存放一张「异常向量表」,每个异常对应一个4字节的跳转指令,指向对应的处理函数。

8.2 异常发生时 CPU 自动做的事
- 将 CPSR 复制到对应模式的 SPSR(保护当前状态,方便异常返回后恢复)
- 设置新的 CPSR 值(切换到对应的异常模式,设置中断屏蔽位 I/F)
- 保存返回地址到 LR(LR_<mode> = PC + 偏移量,各模式偏移量不同)
- 设置 PC = 异常向量表中对应异常的地址(如 IRQ → PC = 0x18)
8.3 异常返回时需要做的事(软件负责)
- 从 SPSR_<mode> 恢复 CPSR(恢复到异常前的工作模式和状态)
- 从 LR_<mode> 恢复 PC(返回异常发生时的下一条指令继续执行)
|--------------------|----------------------------------------------------------------------------------------------------------|
| ⚠️ 返回地址的偏移 | 不同异常的 LR 保存的返回地址有偏移,返回时需要手动减去偏移量:IRQ/FIQ → LR-4;Data Abort → LR-8;SWI/Undef → LR 本身(无偏移)。这是因为流水线超前取指导致的。 |