一、嵌入式系统
嵌入式:以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。
设计时根据用户需求权衡:功耗、体积、环境、稳定性、可靠性。
典型分层(自底向上):
| 层级 | 说明 |
|---|---|
| 硬件系统 | 处理器 + 存储器 + 外设 |
| 操作系统 SYS | 内核、驱动 |
| 应用层 APP | 具体业务程序 |
二、计算机系统组成
计算机系统 = 硬件系统 + 软件系统
- 软件系统 = 应用软件 + 系统软件
计算机硬件系统五大组成:
- 运算器
- 控制器
- 存储器
- 输入设备
- 输出设备
其中存储器又可细分为:ROM、RAM、Cache、Register(寄存器)。
三、常见处理器分类
| 缩写 | 全称 | 中文 | 特点 |
|---|---|---|---|
| CPU | Central Processing Unit | 中央处理单元 | 强大的通用型处理器 |
| GPU | Graphics Processing Unit | 图形处理单元 | 擅长图形运算 |
| FPU | Float Processing Unit | 浮点运算单元 | 负责浮点运算 |
| NPU | Neural Processing Unit | 神经网络处理器 | 擅长 AI / 神经网络运算 |
嵌入式领域专用处理器:
- MPU(Micro Processing Unit,微处理器):通用型,偏向处理
- MCU(Micro Controller Unit,微控制器):集成度高,偏向控制(即"单片机"------单片微型计算机系统)
- DSP(Digital Signal Processor,数字信号处理器):为高强度数学运算而设计的专用芯片
- SoC(System on Chip,片上系统):一种集成和设计的理念------像一张蓝图,把"市政府(MPU)、警察局(MCU)、研究所(DSP)、机场(调制解调器)"放在同一片土地(芯片)上,形成一个功能完善的城市
SoC 内部通常集成: 内核(kernel1 / kernel2)、GPIO、PWM、UART、timer、硬盘控制器等。
四、RAM 与 ROM 对比
| 对比项 | RAM(随机访问存储器) | ROM(只读存储器) |
|---|---|---|
| 直接寻址 | ✅ 可被处理器直接寻址 | ❌ 一般不可直接寻址 |
| 单位价格 | 高 | 低 |
| 掉电保持 | 易失性存储器 | 非易失性存储器 |
| 读写速率 | 高 | 低 |
五、指令集架构:CISC vs RISC
主流架构:X86、ARM、MIPS、RISC-V
- CISC(Complex Instruction Set Computer,复杂指令集架构) :代表 X86(X64 是 X86 的 64 位扩展)
- RISC(Reduced Instruction Set Computer,精简指令集架构) :代表 ARM
二八定律:2*4 <=> 2+2+2+2------80% 的时间只在执行 20% 的指令,因此精简指令集把常用指令做快,少见指令尽量少而精。
六、ARM 指令集与内核系列
- 指令集版本:V1 ~ V4 ~ V9,常见有 V4、V5、V7、V9
- 内核型号:ARM1 ~ ARM11
ARM Cortex 三大系列:
| 系列 | 定位 | 对应处理器 |
|---|---|---|
| Cortex-A | 应用级(App) | MPU |
| Cortex-R | 实时(Real-time) | 实时控制 |
| Cortex-M | 微控制器(MCU) | MCU |
七、ARM 核心结构
- 机器字长:ARM kernel 为 32 bit(4 字节)
通用寄存器(R0 ~ R15):
- R0、R1、R2 ...(通用目的)
- R13 = sp(stack pointer):栈顶指针寄存器
- R14 = lr(link register):链接寄存器
- R15 = pc(program counter):程序计数器
关键单元:
- ALU(Arithmetic Logical Unit):算术逻辑单元
- Cache(高速缓存) :
- iCache(指令缓存):打开
- dCache(数据缓存):关闭
- MMU(Memory Management Unit,内存管理单元) :负责物理内存空间 ↔ 虚拟内存空间 的地址转换;可关闭 MMU
- CPSR(Current Program Status Register):当前程序状态寄存器
- SPSR(Saved Program Status Register):备份程序状态寄存器
八、总线
- 数据总线:32 根
- 地址总线 :32 根,寻址范围
0x0000 0000 ~ 0xFFFF FFFF - 控制总线:若干根
九、虚拟内存布局(从高地址到低地址)
0xFFFF FFFF
┌──────────────┐
│ 操作系统内核 │
├──────────────┤
│ 栈 区 │ ← 向下生长
├──────────────┤
│ 堆 区 │ ← 向上生长
├──────────────┤
│ 已初始化数据 │
├──────────────┤
│ 未初始化数据 │
├──────────────┤
│ 静态 区 │
├──────────────┤
│ 代码 段 │
0x0000 0000 │
│
RAM(1G) │ ROM(nor flash)
└──────────────┘
十、函数调用与栈帧
示例代码:
c
int fun0(int a, int b) { // 0x2000
if (a > b) return a;
if (a <= b) return b;
}
int fun1(int a, int b) { // 0x4000
int sum = 0;
sum = a + b;
return sum;
}
int main() { // 0x1000
int a = 100;
int b = 200;
bl 0x2000(a, b);
sum = a + b;
}
调用过程中寄存器值:
R13 = spR14 = lr = 0x3000 + 4R15 = pc = 0x3004
栈帧(从栈底到栈顶):
- 栈底:
main帧(a = 100,b = 200) - 中间:
fun0帧 - 栈顶:
fun1帧
十一、GCC 编译四步走
bash
gcc -E main.c -o main.i # 预处理
gcc -S main.i -o main.s # 编译(生成汇编)
gcc -c main.s -o main.o # 汇编(生成目标文件)
gcc main.o -o main.out # 链接(生成可执行文件)
十二、三级流水线
指令执行分三级:预取 → 译码 → 执行,多条指令重叠执行以提高吞吐:
指令1: [预取][译码][执行]
指令2: [预取][译码][执行]
指令3: [预取][译码][执行]
十三、AMBA 总线
- AHB(Advanced High-performance Bus):先进的高速总线,连接高速外设
- APB(Advanced Peripheral Bus) :先进的外设总线,连接低速外设TOC