1、环境介绍

平台:T113 Buildroot + Qt 5.15.9

SDK:Tina5.0 V1.2

存储介质:SPI NAND Flash

2、前言

这里讨论的启动速度,指的是设备上电到应用桌面显示的整个时间。关于启动速度优化,总结下来,可以分为两个部分:第一种是常规的优化,关闭打印,关闭多余的外设驱动等;第二种需要结合自己的应用,看看哪里卡的比较久,可以优先让桌面先显示出来,其它服务器再后开。

3、优化前的启动时间

设备上电到显示 Qt 桌面的时长:15 ~ 22 秒之间(记忆值)

4、常规优化

4.1、U-Boot

4.1.1、配置裁剪

  1. 查看 uboot 设备树,把不需要的设备 disabled。
  2. 查看 uboot 配置单,把不需要的驱动直接关掉。可以借助 AI 来判断。比如关掉用不到的屏幕驱动。
  3. 通过查看启动 log 的打印,再次确认大幅影响启动速度的配置,然后针对性修改,修改范围包括但不限于程序、设备树、配置单。

4.1.2、关闭日志打印

  1. 上一步完成后,现在可以关闭打印:
<sdk>/device/config/chips/t113/configs/xiaozhi/sys_config.fex

<sdk>/device/config/chips/t113/configs/xiaozhi/uboot-board.dts

  1. 调整 bootdelay:
<sdk>/device/config/chips/t113/configs/xiaozhi/buildroot/env.cfg

4.2、内核

4.2.1、配置裁剪

和 U-Boot 同理。

4.2.2、关闭日志打印

<sdk>/device/config/chips/t113/configs/xiaozhi/buildroot/env.cfg

4.2.3、优化随机数子系统

禁用内核随机数子系统的启动期阻塞策略:

<sdk>/kernel/linux-5.4/drivers/char/random.c

4.2.4、优化 MIPI 屏初始化序列

修改 MIPI 初始化序列,降低延时:

uboot 驱动需要同步修改。

4.3、系统层

先启动 APP 再启动系统服务:

/etc/inittab

# /etc/init.d/rcS 里可以加个延时,延后执行
/etc/init.d/rcS

5、测试

经过上面的调整,测试结果如下:

  1. 设备插上电 ----> boot0 ----> uboot ----> 内核开始启动:平均耗时 2.7s 左右
  2. 内核开始启动 ----> 内核启动结束 ----> 文件系统开机脚本被执行:1.8s 左右
  3. 文件系统开机脚本被执行 ----> UI 桌面出来:5~6s 左右

整体需要 10s 左右。

6、继续优化

6.1、U-Boot

uboot 阶段目前是 2.7s 左右,可以把显示驱动关掉,大概可以再快 1s 左右,缺点是无法显示 logo:

CONFIG_DISP2_SUNXI=n
CONFIG_BOOT_GUI=n
CONFIG_CMD_SUNXI_BMP=n

这部分的优化我最后取消了。

6.2、启动顺序优化

秉承一个思想:所有无关紧要的东西都可以放在桌面出来后再去启动。

6.3、Qt 程序优化

  1. 之前的 qt 程序启动时,会报警告:
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed

这是因为 Qt 在转换字符编码时调用 iconv 库失败,通常因为交叉编译时未启用 iconv 或目标系统缺少 locale 支持,Qt 回退使用 Latin-1 编码。需要在编译 Qt 时指定 -no-iconv。这个警告解决后,可以提升 1s。

  1. Qt main.c 程序中,可以使用事件循环延迟执行机制, 将耗时初始化延迟到事件循环中执行:
QTimer::singleShot(0, [&]() {
  ...
})

7、继续测试

  1. 设备插上电 ----> boot0 ----> uboot ----> 内核开始启动:平均耗时 2.7s 左右
  2. 内核开始启动 ----> 内核启动结束 ----> 文件系统开机脚本被执行:1.8s 左右
  3. 文件系统开机脚本被执行 ----> UI 桌面出来:3.5s 左右

总体耗时大概在 8s 左右。如果关闭 uboot 显示驱动,大概在 7s 左右。

8、参考文章

https://www.sohu.com/a/736576759_120104787

在 ARM 平台上如何实现Linux系统的1秒启动

9、总结

以上的操作都还算是触手可及的,对于更极致的快启追求,可以根据 Linux 启动流程原理,在每个环节的引导过程中再做优化。
嵌入式Linux学习交流群:424571391

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐