1. 启动流程概述:什么是嵌入式启动
各位同学,咱们今天正式开讲。嵌入式启动这个话题,说实话,我见过太多工程师栽跟头了。有的人调了三天三夜,结果发现是启动配置搞错了。有的人产品都量产了,才发现启动顺序有隐患。嗯,咱们从第一课就把底子打牢。
1.1 什么是嵌入式启动
嵌入式启动,说白了就是:系统上电后,从一片空白到跑起应用程序的整个过程。
你想想看,CPU 上电那一刻,寄存器全是随机值,内存里空空如也。它怎么知道该执行哪段代码?怎么知道硬件初始化到什么程度?怎么把操作系统加载起来?
这个过程,就是启动流程要解决的问题。
核心定义:嵌入式启动 = 从复位向量 → 引导加载程序 → 内核/应用加载 → 系统运行的全链路过程。
我个人习惯把启动流程比作「接力赛」:
- 第一棒:芯片内部固化代码(ROM Bootloader)
- 第二棒:一级引导程序(SPL / MBR)
- 第三棒:二级引导程序(U-Boot / GRUB)
- 第四棒:操作系统内核
- 第五棒:应用程序
每一棒只干一件事,干完就交给下一棒。谁掉棒,系统就起不来。
1.2 启动流程的宏观视角
咱们从高处往下看。一个典型的嵌入式启动流程,大致分这么几步:
- 上电复位:CPU 从复位向量取第一条指令
- 硬件初始化:关看门狗、设置时钟、初始化 DDR
- 引导加载:从存储介质读取启动镜像
- 内核解压与跳转:解压内核,传递启动参数
- 根文件系统挂载:挂载 rootfs,执行 init 进程
- 应用程序启动:用户程序跑起来
我在项目中遇到过最典型的问题:某款工业控制器,每次断电重启有 3% 的概率死机。查了两个月,最后发现是 DDR 初始化时序在低温下不稳定。你看,第一步没走稳,后面全白搭。
我的建议:调试启动问题时,别一上来就怀疑应用层。先确认 CPU 有没有跑起来,再查引导程序,最后才看内核。从底层往上查,效率最高。
下面这张图,把整个启动流程串起来了。你盯着看两分钟,脑子里就有框架了。
1.3 常见启动介质
启动介质,就是存放启动代码的地方。不同的介质,读写方式、速度、可靠性都不一样。选错了,项目可能要多花几周去适配。
咱们把最常见的几种拉出来对比一下:
| 介质类型 | 接口方式 | 读取速度 | 是否支持 XIP | 典型容量 | 成本 |
|---|---|---|---|---|---|
| NOR Flash | Parallel / SPI | 中 | ✅ 支持 | 1MB ~ 64MB | 较高 |
| NAND Flash | Parallel / SPI | 快(连续读) | ❌ 不支持 | 128MB ~ 8GB | 低 |
| eMMC | MMC / SDIO | 快 | ❌ 不支持 | 4GB ~ 256GB | 中等 |
| SD 卡 | SDIO / SPI | 中 | ❌ 不支持 | 1GB ~ 2TB | 低 |
注意:XIP(Execute In Place,原地执行)是 NOR Flash 的独门绝技。CPU 可以直接在 NOR Flash 上执行代码,不用先拷到 RAM 里。NAND 和 eMMC 都不行,必须先把代码加载到 RAM 才能执行。这个差异,决定了启动方案的设计思路。
1.3.1 NOR Flash
NOR Flash 的特点是:随机读取快,支持 XIP。
我在早期做路由器项目时,用的就是 NOR Flash。那时候代码小,整个 U-Boot 直接放在 NOR 里跑,上电就能执行,根本不用操心 DDR 初始化之前代码放哪。省心。
但 NOR 的缺点也很明显:容量做不大,写入慢,价格贵。现在主要用于:
- 小容量启动代码存储(1MB ~ 16MB)
- 对实时性要求高的场景
- 需要 XIP 的早期启动阶段
1.3.2 NAND Flash
NAND Flash 是性价比之王。容量大、价格低,但有个大坑:坏块问题。
我曾经在一个项目里吃过亏。产品用了 NAND Flash,生产了 1000 台,有 30 台启动失败。查到最后,是 NAND 出厂自带的坏块刚好落在启动代码区域。从那以后,我每次用 NAND 都会做两件事:
- 启动代码必须做 ECC 校验
- 关键数据要冗余存储(存两份)
NAND 的典型应用:
- 大容量存储(文件系统、内核镜像)
- 成本敏感型产品
- 配合 SPL 使用(SPL 放在 NOR 或片上 SRAM)
1.3.3 eMMC
eMMC 其实就是 NAND Flash 加了个控制器,把坏块管理、ECC、磨损均衡都封装好了。对开发者来说,它就是个标准的块设备,用起来跟硬盘差不多。
我个人最喜欢 eMMC。为什么?省心。你不用管坏块,不用管擦写均衡,直接读写就行。现在的手机、平板、树莓派,清一色 eMMC。
但 eMMC 也有坑:
- 启动过程复杂(需要 MMC 协议初始化)
- 早期启动代码不能直接放 eMMC(CPU 不认识 MMC 协议)
- 需要片内 ROM 或小容量 NOR 做一级引导
1.3.4 SD 卡
SD 卡和 eMMC 本质上是一家人,协议几乎一样。区别在于 SD 卡是可插拔的,eMMC 是焊在板子上的。
SD 卡常用于:
- 开发阶段的调试启动
- 产品升级(插卡升级固件)
- 低成本方案(不用焊 Flash,直接插卡)
但量产产品用 SD 卡要小心。接触不良、卡座寿命、不同品牌兼容性,都是坑。我见过一个产品,换了批 SD 卡就启动不了,最后发现是卡初始化时序有差异。
选型建议:
- 小容量、高可靠 → NOR Flash
- 大容量、低成本 → NAND Flash(但要处理好坏块)
- 大容量、省心 → eMMC
- 开发调试、小批量 → SD 卡
1.4 启动介质的选择逻辑
实际项目中,启动介质往往不是单选。很多芯片支持多种启动方式,通过管脚电平或熔丝配置。
举个例子,我做过的一个 i.MX6 项目:
- 一级启动:片内 ROM 从 SD 卡加载 SPL
- 二级启动:SPL 初始化 DDR,从 eMMC 加载 U-Boot
- 三级启动:U-Boot 从 eMMC 加载内核和文件系统
你看,一个系统用了三种介质。为什么?因为每种介质在最合适的阶段发挥最擅长的作用。
下面这张图,帮你理清选择逻辑:
1.5 本章小结
这一章咱们把启动流程的宏观框架搭起来了。你记住三件事:
- 启动是接力赛:每一棒只干一件事,交接不能出错
- 介质决定方案:NOR 可以 XIP,NAND 要处理坏块,eMMC 最省心
- 没有银弹:实际项目往往是多种介质组合使用