一、主题
启动速度是嵌入式系统一项重要的性能指标,是影响用户体验的关键因素之一。
要做启动优化,首先得测量时间,了解当前启动流程的时间消费。然后采用抓大头的思想,从耗时最多的流程去优化。
二、问题分析
全志T527目前启动非常慢,差不多要40秒的时间。分析全志Linux的启动耗时情况,对启动时间进行优化,以提升产品性能指标,增强产品竞争力
1、启动流程
linux 启动大致可以分为以下几个部分::Brom,Boot0,Uboot,Kernel,Rootfs
2、内核启动前时间统计
(1)Brom
一般情况下,串口输出的第一句为:
[146]HELLO! BOOT0 is starting!
以上面打印的时间戳为例,我们可以认为,0 到 146ms 为 brom 的启动时间。
(2)Boot0
而从第一句开始,就是 boot0 的开始启动时间,一直到 boot0 结束打印为止为 boot0 的持续时间。
[146]HELLO! BOOT0 is starting!
[149]BOOT0 commit : 3bbd06be4b
[153]periph0 has been enabled
[156]set pll end
[158]PL gpio voltage : 3.3V
...
...
[3382]Loading boot-pkg Succeed(index=0).
[3387]Entry_name = u-boot
[3394]Entry_name = monitor
[3398]Entry_name = scp
[3402]Entry_name = melis-elf
[3407]Entry_name = dtb
[3427]tunning data addr:0x4a0003e8
[3430]Jump to second Boot.
以上 boot0 的持续时间就为 3430-166=3265ms,总计 3.265 秒,这部分优化空间较大
(3)Uboot
从打印 uboot 的版本号开始,一直到 kernel 开始启动之间,为 uboot 的启动时间。
U-Boot 2018.07 (Nov 13 2024 - 07:35:08 +0000) Allwinner Technology
[03.467]CPU: Allwinner Family
[03.470]Model: sun55iw3
I2C: ready
[03.481]DRAM: 2 GiB
[03.485]Relocation Offset is: 75ec3000
[03.526]secure enable bit: 0
[03.529]PMU: AXP2202
[03.531]BMU: AXP2202
[03.533][AXP2202] comm status : 0x0 = 0x20, 0x1 = 0x90
[03.538][AXP2202] onoff status: 0x20 = 0x4, 0x21 = 0x0
[03.543][AXP2202] reboot/charge status: 0xf0 = 0x0
...
[04.938][mmc]: mmc exit start
[04.956][mmc]: mmc 2 exit ok
以上 uboot 的启动时间为 4956-3467=1489ms
(4)后面就是Kernel和rootfs文件系统部分,一些服务和app的启用
Starting kernel
...
三、内核启动优化
1、降低打印等级,优化启动速度
对device/config/chips/t527/configs/xxx/buildroot/env.cfg进行如下修改:
(1) 将initcall_debug的值改为 1,以便显示出所有驱动的加载过程,供后续分析。
(2)将loglevel的值改为 0,以便关掉所有的开机打印,避免打印耗时的影响。
这里设置后,虽然开机打印被关掉了,但其内容还是保存在 logbuf 里的,开机后使用 dmesg 取出即可(可使用命令dmesg > dmesg.txt来取出)。
(3)增大 log_buf修改内核配置项,将CONFIG_LOG_BUF_SHIFT修改为 18。避免 log_buf 过小导致较早的日志信息被冲掉。
2、驱动裁剪
(1)删除不使用的功能。
如符号表、打印、调试等功能
(2)删除不使用的驱动方案明确之后,所需的内核驱动也明确了。
可以执行./build.sh menuconfig,将没有用到的驱动关闭
四、Boot/Uboot优化
1、冗余打印
boot0 的持续时间就为 3430-166=3265ms,总计 3.265 秒。查看日志发现在uboot之前有很多无关打印,如下:
[145]HELLO! BOOT0 is starting!
...
[108]board init ok
[120]key pressed value=0x13
[133]key pressed value=0x13
[146]key pressed value=0x13
[159]key pressed value=0x13
[172]key pressed value=0x13
[185]key pressed value=0x13
[198]key pressed value=0x13
[211]key pressed value=0x13
[225]key pressed value=0x13
[238]key pressed value=0x13
...
[3094]key pressed value=0x1d
[3107]key pressed value=0x1d
[3120]key pressed value=0x1d
[3123]enable_jtag
[3125]card no is 2
[3127]sdcard 2 line count 8
[3130][mmc]: mmc driver ver 2023-03-24 16:23
...
U-Boot 2018.07 (Nov 13 2024 - 07:35:08 +0000) Allwinner Technology
[03.465]CPU: Allwinner Family
[03.468]Model: sun55iw3
为什么会打印这些按键值?3120-120=3000ms,持续3秒
查看原理图,我们的LRADC是悬空的,需要加个100K上拉电阻。
2、uboot裁剪
uboot2018 的每种芯片或芯片对应的方案都会在 u-boot-2018/configs/目录下有对应的配置文件。配置文件中的每个配置项实质上对应的就是一个模块,添加或移除一个配置项实质就是添加或移除一个模块。T527中uboot启动时长为1秒,对启动影响不大,优化有限。
五、用户空间优化
1、优化Xorg启动
发现在启动Xorg这要卡很久,启动较慢。
(1)更新Buildroot配置,移除X.org相关包并添加新依赖,以达到优化启动速度的目的
--- a/buildroot/buildroot-202205/configs/sun55iw3p1_sany_v7_defconfig
+++ b/buildroot/buildroot-202205/configs/sun55iw3p1_sany_v7_defconfig
@@ -108,25 +108,7 @@ BR2_PACKAGE_QT5SERIALBUS=y
BR2_PACKAGE_QT5SVG=y
BR2_PACKAGE_QT5TOOLS=y
BR2_PACKAGE_QT5TOOLS_LINGUIST_TOOLS=y
-BR2_PACKAGE_XORG7=y
-BR2_PACKAGE_XSERVER_XORG_SERVER=y
-BR2_PACKAGE_XCB_UTIL_CURSOR=y
-BR2_PACKAGE_XAPP_XCALC=y
-BR2_PACKAGE_XAPP_XCLOCK=y
-BR2_PACKAGE_XAPP_XCONSOLE=y
-BR2_PACKAGE_XAPP_XDPYINFO=y
-BR2_PACKAGE_XAPP_XEYES=y
-BR2_PACKAGE_XAPP_XHOST=y
-BR2_PACKAGE_XAPP_XINIT=y
-BR2_PACKAGE_XAPP_XINPUT=y
-BR2_PACKAGE_XDRIVER_XF86_INPUT_EVDEV=y
-BR2_PACKAGE_XDRIVER_XF86_INPUT_KEYBOARD=y
-BR2_PACKAGE_XDRIVER_XF86_INPUT_LIBINPUT=y
-BR2_PACKAGE_XDRIVER_XF86_INPUT_MOUSE=y
-BR2_PACKAGE_XDRIVER_XF86_INPUT_TSLIB=y
-BR2_PACKAGE_XDRIVER_XF86_VIDEO_FBDEV=y
-BR2_PACKAGE_XTERM=y
-BR2_PACKAGE_FLUXBOX=y
+BR2_PACKAGE_XKEYBOARD_CONFIG=y
BR2_PACKAGE_MEMTESTER=y
BR2_PACKAGE_SUNXI_MALI_UTGARD=y
BR2_PACKAGE_UBOOT_TOOLS=y
@@ -145,6 +127,8 @@ BR2_PACKAGE_WEBP=y
BR2_PACKAGE_WEBP_DEMUX=y
BR2_PACKAGE_WEBP_MUX=y
BR2_PACKAGE_LIBAIO=y
+BR2_PACKAGE_LIBINPUT=y
+BR2_PACKAGE_LIBPCIACCESS=y
BR2_PACKAGE_LIBV4L=y
BR2_PACKAGE_LIBV4L_UTILS=y
BR2_PACKAGE_LIBXKBCOMMON=y
@@ -160,6 +144,7 @@ BR2_PACKAGE_BOOST=y
BR2_PACKAGE_PROTOBUF=y
BR2_PACKAGE_PROTOBUF_C=y
BR2_PACKAGE_RE2=y
+BR2_PACKAGE_XUTIL_UTIL_MACROS=y
BR2_PACKAGE_BLUEZ5_UTILS_CLIENT=y
BR2_PACKAGE_BLUEZ5_UTILS_MONITOR=y
BR2_PACKAGE_BLUEZ5_UTILS_TOOLS=y
(END)
移除了大量X.org相关的软件包,包括xorg7、xserver-xorg-server、xcb-util-cursor等
2、awlink服务
这个阶段非常耗时,卡了很长时间
/etc/init.d/S20awlink去掉了,这个可以应用自己来启动。
3、关闭检测烧写key 提高启动时
打开和关闭检测usb key时间对比
(1)打开
(2)关闭
(3)具体表现
以上可以看出当打开始启动时间为5.011秒,打开时log 有打印do_burn_from_boot usb
字段,关闭方式的启动时间为4.422秒。
(4)更改uboot dts关闭烧key 流程。打开 SDK,找到在device目录下找到芯片对应的板级目录。将target节点下的burn_key的属性改成 0 即可
目录:device/config/chips/t527/configs/xxx/uboot-board.dts
&target {
boot_clock = <1296>; /*CPU boot frequency, Unit: MHz*/
storage_type = <0xffffffff>; /*boot medium, 0-nand, 1-card0, 2-card2, -1(defualt)auto scan*/
burn_key = <0>; /*1:support burn key; 0:not support burn key*/
dragonboard_test = <0>; /*1:support card boot dragonboard; 0:not support card boot dragonboard*/
};
4、优化dhcpcd服务的启动速度,使其放入后台启动
启动过程中,dhcpcd服务的启动速度较慢,手动编写S41dhcpcd,覆盖原有的
--- /dev/null
+++ b/buildroot/buildroot-202205/board/allwinner/t527/fs-overlay-sany_v7-rootfs/etc/init.d/S41dhcpcd
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# Start/stop dhcpcd
+#
+
+DAEMON=/sbin/dhcpcd
+CONFIG=/etc/dhcpcd.conf
+PIDFILE=/var/run/dhcpcd.pid
+
+[ -f $CONFIG ] || exit 0
+
+case "$1" in
+ start)
+ echo "Starting dhcpcd..."
+ start-stop-daemon -S -x "$DAEMON" -p "$PIDFILE" -- -f "$CONFIG" &
+ ;;
+ stop)
+ echo "Stopping dhcpcd..."
+ start-stop-daemon -K -x "$DAEMON" -p "$PIDFILE" -o
+ ;;
+ reload|force-reload)
+ echo "Reloading dhcpcd configuration..."
+ "$DAEMON" -s reload
+ ;;
+ restart)
+ "$0" stop
+ sleep 1 # Prevent race condition: ensure dhcpcd stops before start.
+ "$0" start
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|reload|force-reload}"
+ exit 1
+esac
+
(END)
到此完结,启动时间优化至8秒。