嵌入式设备启动时间优化:从上电到应用就绪,每一毫秒怎么抠

客户投诉设备启动慢,是深圳做嵌入式产品的人最常遇到的事。

"你们这个闸机,刷卡到开闸要8秒,太慢了。"

"这个工业平板,上电到能操作要15秒,操作工等得心焦。"

"设备一重启,半天起不来,现场生产都停了。"

很多工程师的第一反应是:启动慢是SoC慢、是eMMC慢,没办法。但真正会优化的人知道,启动时间完全是可以抠出来的------从上电到应用就绪,每一毫秒都有地方可以省。

这篇文章讲透嵌入式设备启动时间怎么优化:启动时间都花在哪、每段怎么省、怎么测量验证。文章末尾配一张启动流程阶段与优化手段汇总图,一图看懂怎么抠。

一、启动时间都花在哪

要优化启动时间,先要知道时间都花在哪。嵌入式设备(以瑞芯微/全志这类SoC + Linux为例)的启动流程,大致分四个阶段:

阶段一:BootROM(约几十到几百毫秒)

SoC上电后,内部BootROM最先运行。它负责初始化最基础的硬件(时钟、内存控制器初始化前的最小配置),然后从启动介质(SPI NOR、eMMC、SD等)读取引导代码。

BootROM时间很短,一般几十到几百毫秒,优化空间不大,但要注意------从BootROM到读取U-Boot的介质选择会影响时间(SPI NOR比eMMC快,因为不用初始化复杂的MMC控制器)。

阶段二:U-Boot引导(约几百毫秒到2秒)

U-Boot负责初始化DDR、初始化板级外设、从存储加载内核和设备树、跳转内核。

U-Boot时间是启动优化的重头戏,因为很多U-Boot默认做了大量不必要的工作:

  1. 完整初始化所有外设(实际很多用不到)。

  2. 串口打印一堆调试信息(打印本身耗时)。

  3. 等待用户按键进入菜单(默认等待几秒)。

  4. 做完整的环境变量、校验。

  5. 反复扫描存储介质、探测设备。

阶段三:内核启动(约1到3秒)

U-Boot跳转内核后,内核初始化(initcall)、枚举设备、加载驱动、挂载rootfs。

内核启动时间主要花在:

  1. 初始化不必要的驱动和设备(很多默认全开)。

  2. 逐个initcall串行执行。

  3. 文件系统挂载慢(某些文件系统初始化慢)。

  4. 控制台、串口、显示初始化耗时。

阶段四:应用初始化(约几百毫秒到几秒)

内核起来后,init进程启动,执行init脚本、启动服务、加载应用。

应用初始化慢的原因:

  1. init脚本串行执行一堆服务。

  2. 应用启动时做大量初始化(读配置、连网络、初始化外设)。

  3. 没有做延迟加载、并行启动。

典型占比:BootROM 5%、U-Boot 30%、内核 40%、应用 25%。四段都优化,才能把启动时间真正压下来。

二、BootROM和U-Boot阶段怎么省

先看启动最早的阶段。BootROM基本没法改(SoC固化),但U-Boot大有可为。

优化1:跳过不必要的等待

U-Boot默认会等待按键进入命令行(比如2秒)。把bootdelay设为0,上电直接启动,立省2秒。

优化2:裁剪U-Boot功能

去掉用不到的初始化:

  1. 关掉不用的外设初始化(网络、USB、显示等,如果启动用不到)。

  2. 关掉串口调试打印(每条打印都耗时,量产版关掉)。

  3. 关掉不必要的存储介质扫描(只扫要用的介质)。

优化3:优化DDR初始化

DDR训练(Training)是最耗时的U-Boot环节之一。瑞芯微/全志的U-Boot里,DDR训练参数一般固化在DDR配置里。优化方法:

  1. 确认DDR参数配对(容量、速率),训练失败会重试,非常耗时。

  2. 用快速训练模式(如果SoC支持,跳过部分训练步骤)。

  3. 复用已验证的DDR配置,避免每次都做完整训练。

优化4:从快的介质启动

SPI NOR支持XIP,上电后U-Boot可以从SPI NOR直接读取执行,比从eMMC启动快(eMMC要先初始化MMC控制器)。如果产品对启动速度要求高,Bootloader放SPI NOR。

三、内核启动阶段怎么省

内核启动是时间大头,优化手段也多。

优化1:裁剪内核

内核默认编译了一堆驱动,很多用不到。按产品实际硬件裁剪:

  1. 只编译用到的驱动(模块化或内置但禁用不需要的)。

  2. 去掉用不到的协议栈、文件系统、功能。

内核越小,初始化越少,启动越快。

优化2:减少initcall执行

内核启动是串行执行initcall的,每个initcall都有开销。减少方式:

  1. 禁用不需要的内核配置项(减少initcall数量)。

  2. 编译成模块(module)的驱动按需加载,不全部内置。

  3. 用设备树(DTB)只使能实际用到的设备,减少设备枚举和驱动probe。

优化3:加速文件系统挂载

rootfs挂载是内核启动的一个关键点:

  1. 用squashfs(只读压缩文件系统)------挂载快、只读安全、镜像小。

  2. 或把rootfs做成initramfs(内存文件系统)------内核起来后直接从内存解压,不访问存储,启动快。

  3. 避免用慢的文件系统做rootfs(某些情况下ext4挂载+日志初始化偏慢)。

优化4:内核快速启动参数

Linux有一些快速启动相关的配置和参数(如减少console初始化、关闭一些启动时的检查),按需启用。

四、应用初始化阶段怎么省

内核起来了,应用能不能快起来,看init和应用设计。

优化1:并行启动

init脚本默认串行启动服务,一个个来。改成并行(后台启动非关键服务),能显著缩短到"可操作"的时间。关键服务先起,非关键的后台起。

优化2:延迟加载

应用启动时不一次性加载所有东西:

  1. 非核心功能延迟到需要时再加载(网络、声音、云连接等)。

  2. 大文件、大资源按需读取,不在启动时全加载。

优化3:减少阻塞

应用启动时如果有一堆阻塞操作(连服务器、读慢设备、同步IO),会卡住界面。优化:

  1. 异步初始化,界面先出,后台再加载。

  2. 减少启动时的网络等待(超时设短,或后台连接)。

  3. 减少启动时的大文件读写。

优化4:精简init链

init脚本少做无用功:去掉不需要的服务、合并脚本、减少echo打印。

五、怎么测量启动时间

优化前先测量,优化后要验证。测量方法:

方法1:串口时间戳

U-Boot和内核都会在串口打印时间戳(如内核的 0.000000 ...)。从串口日志看每段的时间点,能定位时间花在哪。

方法2:GPIO打点

在BootROM、U-Boot、内核、应用的关键节点翻转一个GPIO,用示波器或逻辑分析仪测GPIO翻转时间。精确、不依赖软件。

方法3:系统时间点

在应用就绪时记录系统启动时间(读/proc/uptime),和上电时间对比,得到总启动时间。再配合各阶段日志定位瓶颈。

方法4:bootchart/系统trace

用bootchart或内核trace工具,看启动过程各进程/各阶段的时间占用,找出最耗时的环节。

注意:测量要覆盖多次(启动时间有波动),取典型值,且在高低温、不同批次下确认稳定。

六、启动流程阶段与优化手段

下面这张图把嵌入式设备启动流程和每段的优化手段汇总起来,一图看懂怎么抠时间。

图中要点:

  • 左侧:启动流程四阶段------BootROM → U-Boot → 内核 → 应用,以及各自的时间占比。

  • 右侧:每阶段的优化手段------U-Boot(跳等待/裁剪/快速训练/快介质)、内核(裁剪/减initcall/快文件系统)、应用(并行/延迟/异步)。

  • 底部:测量验证方法------串口时间戳、GPIO打点、系统时间、bootchart。

七、总结

启动时间优化不是玄学,是一段一段抠出来的。从上电到应用就绪,每一段都有明确的优化手段,每一毫秒都能省下来。

核心要点总结:

  1. 启动四阶段:BootROM → U-Boot → 内核 → 应用,典型占比 5% / 30% / 40% / 25%。

  2. U-Boot阶段:bootdelay设0、裁剪功能、关串口打印、快速DDR训练、Bootloader放SPI NOR。

  3. 内核阶段:裁剪内核、减少initcall、用squashfs/initramfs、优化挂载。

  4. 应用阶段:并行启动、延迟加载、异步初始化、精简init链。

  5. 测量先行:串口时间戳、GPIO打点、系统时间、bootchart,先定位再优化。

  6. 全链路优化:四段一起优化,才有效果;只优化一段,瓶颈还是在那。

  7. 稳定性优先:优化后要在高低温、多批次下验证稳定,别为快牺牲可靠性。

  8. 从需求出发:不是越快越好,按产品需求定目标(交互设备要快,后台设备可容忍稍慢)。

最后一句话:启动慢不是SoC的锅,是你还没把每一段的时间抠出来。 从上电到应用就绪,每一毫秒都值得。

有启动时间优化相关的问题,欢迎评论区交流。

相关推荐
a5986525 小时前
云手机怎么选?ARM服务器原生架构和X86模拟器差别很大
服务器·arm开发·智能手机
李某学编程17 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
XMAIPC_Robot1 天前
基于 i.MX95 平台在新一代工业控制器中的应用 — 工业车载平板、半导体设备主控方案解析
arm开发·人工智能·机器学习·fpga开发·rk3588+fpga·i.mx95
女神下凡1 天前
芯参谋(71):全桥电机驱动电路设计指南
arm开发·stm32·单片机·嵌入式硬件·硬件工程·设计规范·1024程序员节
szxinmai主板定制专家1 天前
基于 AM62x + Artix-7 的低功耗 ARM+FPGA 平台在轨道交通车门控制中的应用
arm开发·人工智能·fpga开发·zynq·am62x
幻智星科技1 天前
我砍掉了FPGA里的ARM核项目反而提前交付了
arm开发·网络协议·fpga开发·硬件架构
女神下凡2 天前
芯参谋(69):LED恒流驱动芯片电路设计指南
arm开发·人工智能·单片机·嵌入式硬件·设计规范
工控存储研习2 天前
瑞芯微平台存储系统设计:DDR、eMMC、SPI NOR、SPI NAND怎么配才合理
arm开发
szxinmai主板定制专家2 天前
ARM 还是 x86?CODESYS 数控机床控制器选型、FPGA 取舍与实时性真相
arm开发·人工智能·fpga开发·zynq·1024程序员节·codesys