T527 Linux 启动速度优化

一、主题

启动速度是嵌入式系统一项重要的性能指标,是影响用户体验的关键因素之一。

要做启动优化,首先得测量时间,了解当前启动流程的时间消费。然后采用抓大头的思想,从耗时最多的流程去优化。

二、问题分析

全志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秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风从不入睡、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值