入门导读
如果你是第一次接触嵌入式,这篇文章可以帮你建立一张完整的知识地图:从"什么是嵌入式系统"开始,逐层往下拆------先搞清楚硬件由哪些部件组成、存储器怎么分类,再理解处理器架构和指令集的区别,最后深入ARM32内核的寄存器、流水线、移位指令和编译流程。每一节都对应嵌入式开发中最常遇到的基础概念,读完你就能把"单片机""ARM""Cortex-M""MMU""流水线"这些词串成一条线,而不是零散地记。
一、嵌入式系统基础概念
嵌入式系统:以应用为中心、以计算机技术为基础,软硬件可裁剪的专用计算机系统。设计需要综合考量功耗、体积、环境适应性、稳定性、可靠性等需求。
嵌入式系统三层架构:
- 应用层(APP):上层业务应用程序
- 操作系统层(SYS):嵌入式操作系统,负责资源调度管理
- 硬件系统层:底层硬件电路、处理器、外设
计算机系统两大组成:硬件系统 + 软件系统。软件系统分为应用软件、系统软件。
计算机硬件五大核心部件
运算器、控制器、存储器、输入设备、输出设备。
运算器 + 控制器集成在一起,就是CPU。
各类处理器简介
- CPU(中央处理器):通用型强大处理器,侧重通用计算
- GPU(图形处理器):图形图像处理单元,并行计算能力强
- FPU(浮点运算单元):专门负责浮点数运算
- NPU(神经网络处理器):面向AI神经网络运算
嵌入式领域常用处理器:
- MPU 微处理器:通用型,侧重复杂运算,如ARM Cortex-A系列
- MCU 微控制器:集成度高,侧重控制,也就是常说的单片机
单片机:单片微型计算机系统,片上集成CPU、RAM、ROM、外设
- DSP 数字信号处理器:专为高强度数学、信号处理设计
- SoC 片上系统:集成设计理念,把MPU、MCU、DSP、外设等全部集成在同一块芯片,形成完整系统
存储器分类
-
RAM 随机存取存储器
- 可被处理器直接寻址
- 单位空间价格高
- 易失性存储器,断电丢失数据
- 读写速度快
-
ROM 只读存储器
- 一般不可直接寻址
- 单位存储价格低
- 非易失存储器,断电数据保留
- 读写速率偏低
二、处理器架构与指令集
主流架构:X86、ARM、MIPS、RISC-V
指令集分类:
- CISC 复杂指令集:代表X86,指令繁多,长度不等
- RISC 精简指令集:代表ARM,指令少、定长,流水线执行
ARM指令集版本:ARMv1 ~ v9
ARM内核分类:
- Cortex‑A:应用处理器(带MMU,跑Linux)
- Cortex‑R:实时内核
- Cortex‑M:微控制器内核(MCU,无MMU,单片机)
三、ARM32内核硬件模型
ARM32位内核,机器字长32bit。
1. 内部核心模块
- 通用寄存器 R0~R15
- ALU:算术逻辑运算单元,完成加减、逻辑运算
- Cache高速缓存:分为I-Cache(指令缓存)、D-Cache(数据缓存),提升访问速度
- MMU 内存管理单元:完成虚拟内存 ↔ 物理内存地址转换;开启MMU使用虚拟地址空间;关闭MMU直接访问物理地址
总线:
- AHB:先进高速总线,接高速设备
- APB:先进外设总线,接低速外设(GPIO、UART、PWM、Timer)
2. ARM关键寄存器
- CPSR:当前程序状态寄存器,保存N/Z/C/V等条件标志位
- SPSR:备份程序状态寄存器,异常发生时保存CPSR现场
- R13(SP):栈指针寄存器,指向栈顶
- R14(LR):链接寄存器,保存子程序返回地址
- R15(PC):程序计数器,保存当前取指地址
3. 内存空间与栈帧
虚拟内存空间划分:代码段、只读段、已初始化全局、未初始化、栈、堆。
- 代码段:存放编译后的程序指令
- 系统栈:用于函数调用,保存局部变量、返回地址,每一次函数调用生成独立栈帧
函数调用时,LR保存返回地址,栈用来保存函数局部变量与现场。
四、ARM流水线
经典三级流水线:取指 → 译码 → 执行
流水线并行工作,同一时刻多条指令同时处于不同阶段,提升指令吞吐。
五、ARM移位指令等价关系
ARM支持在MOV指令内附带移位操作,等价独立移位指令:
| MOV复合指令 | 等价标准移位指令 |
|---|---|
MOV{S} <Rd>, <Rm>, ASR #n |
ASR{S} <Rd>, <Rm>, #<n> |
MOV{S} <Rd>, <Rm>, LSL #n |
LSL{S} <Rd>, <Rm>, #<n> |
MOV{S} <Rd>, <Rm>, LSR #n |
LSR{S} <Rd>, <Rm>, #<n> |
MOV{S} <Rd>, <Rm>, ROR #n |
ROR{S} <Rd>, <Rm>, #<n> |
MOV{S} <Rd>, <Rm>, ASR <Rs> |
ASR{S} <Rd>, <Rm>, <Rs> |
MOV{S} <Rd>, <Rm>, LSL <Rs> |
LSL{S} <Rd>, <Rm>, <Rs> |
MOV{S} <Rd>, <Rm>, LSR <Rs> |
LSR{S} <Rd>, <Rm>, <Rs> |
MOV{S} <Rd>, <Rm>, ROR <Rs> |
ROR{S} <Rd>, <Rm>, <Rs> |
MOV{S} <Rd>, <Rm>, RRX |
RRX{S} <Rd>, <Rm> |
ASR算术右移、LSL逻辑左移、LSR逻辑右移、ROR循环右移、RRX带进位循环右移。
六、编译流程简述
C源码到可执行文件完整流程:
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 // 链接,生成可执行程序