1. 启动流程概述:什么是嵌入式启动

各位同学,咱们今天正式开讲。嵌入式启动这个话题,说实话,我见过太多工程师栽跟头了。有的人调了三天三夜,结果发现是启动配置搞错了。有的人产品都量产了,才发现启动顺序有隐患。嗯,咱们从第一课就把底子打牢。

1.1 什么是嵌入式启动

嵌入式启动,说白了就是:系统上电后,从一片空白到跑起应用程序的整个过程。

你想想看,CPU 上电那一刻,寄存器全是随机值,内存里空空如也。它怎么知道该执行哪段代码?怎么知道硬件初始化到什么程度?怎么把操作系统加载起来?

这个过程,就是启动流程要解决的问题。

核心定义:嵌入式启动 = 从复位向量 → 引导加载程序 → 内核/应用加载 → 系统运行的全链路过程。

我个人习惯把启动流程比作「接力赛」:

  • 第一棒:芯片内部固化代码(ROM Bootloader)
  • 第二棒:一级引导程序(SPL / MBR)
  • 第三棒:二级引导程序(U-Boot / GRUB)
  • 第四棒:操作系统内核
  • 第五棒:应用程序

每一棒只干一件事,干完就交给下一棒。谁掉棒,系统就起不来。

1.2 启动流程的宏观视角

咱们从高处往下看。一个典型的嵌入式启动流程,大致分这么几步:

  1. 上电复位:CPU 从复位向量取第一条指令
  2. 硬件初始化:关看门狗、设置时钟、初始化 DDR
  3. 引导加载:从存储介质读取启动镜像
  4. 内核解压与跳转:解压内核,传递启动参数
  5. 根文件系统挂载:挂载 rootfs,执行 init 进程
  6. 应用程序启动:用户程序跑起来

我在项目中遇到过最典型的问题:某款工业控制器,每次断电重启有 3% 的概率死机。查了两个月,最后发现是 DDR 初始化时序在低温下不稳定。你看,第一步没走稳,后面全白搭。

我的建议:调试启动问题时,别一上来就怀疑应用层。先确认 CPU 有没有跑起来,再查引导程序,最后才看内核。从底层往上查,效率最高。

下面这张图,把整个启动流程串起来了。你盯着看两分钟,脑子里就有框架了。

嵌入式启动流程宏观视图 嵌入式启动流程宏观视图 上电复位 复位向量 → 第一条指令 硬件初始化 时钟 / DDR / 外设 引导加载 Bootloader → 加载镜像 内核启动 解压 / 初始化 文件系统 挂载 rootfs 应用程序 用户程序运行 接力赛比喻 第一棒:ROM Bootloader 第二棒:SPL / MBR 第三棒:U-Boot / GRUB 第四棒:操作系统内核 常见问题 • DDR 初始化时序不稳 • 启动介质配置错误 • 引导程序损坏

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 都会做两件事:

  1. 启动代码必须做 ECC 校验
  2. 关键数据要冗余存储(存两份)

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 加载内核和文件系统

你看,一个系统用了三种介质。为什么?因为每种介质在最合适的阶段发挥最擅长的作用。

下面这张图,帮你理清选择逻辑:

启动介质选择逻辑 启动介质选择逻辑 需要多大容量? ≤ 64MB NOR Flash ≥ 128MB NAND / eMMC / SD 需要坏块管理? 是 eMMC 否 NAND Flash

1.5 本章小结

这一章咱们把启动流程的宏观框架搭起来了。你记住三件事:

  • 启动是接力赛:每一棒只干一件事,交接不能出错
  • 介质决定方案:NOR 可以 XIP,NAND 要处理坏块,eMMC 最省心
  • 没有银弹:实际项目往往是多种介质组合使用