您尚未登录。

楼主 #1 2018-10-04 22:56:32

Quotation
会员
注册时间: 2018-10-04
已发帖子: 296
积分: 264.5

XBOOT尺寸裁剪(170kB不带图形系统)

原文发表于个人Blog http://quotation.github.io/development/2018/10/04/xboot-tailoring.html

硬件平台:全志F1C100s
系统:XBOOT
工具链:gcc-arm-none-eabi

XBOOT默认的配置带了很多功能,编译后的尺寸颇大,影响启动时间。因为XBOOT启动过程的大部分时间是花在从Flash拷贝代码到RAM,所以只要能把编译结果的尺寸降下来,就可以成比例地加快启动速度。
在对XBOOT做裁剪优化后,编译后的尺寸从默认的4MB降至<170kB(不带图形系统和Lua,带文件系统),启动速度完全满足要求。

裁剪

未优化前,默认编译结果xboot.bin尺寸为4MB。
以下的裁剪措施分若干个步骤,可根据自己的需要的功能,只采取部分步骤。

优化步骤:
1. 去除不用的资源文件,尺寸减到3.3MB。XBOOT带了字体、图片、示例Lua脚本等资源文件,如果完全用不着图形界面,直接删掉。(如果应用中确实需要用到大量资源,参见本文最后给出的优化方法。)
步骤:
* 删除src/romdisk目录;
* 修改src/Makefile,去除“$(CP) romdisk .obj”这行,但是保留arch/下的romdisk。

2. 去除Lua框架,尺寸减到3MB。快速开发点简单的东西用Lua比较方便,由于我们的产品是用C/C++开发,所以Lua完全用不着。
步骤:
* 修改src/Makefile,去除所有lua、framework相关的行;
* 编译一下,根据编译错误,删除代码里相关的引用。

3. 去除图形库,尺寸减到403kB。图形图像相关的库比较多,可根据需要裁剪。很多应用场景不需要矢量图形、矢量字体,只需要libpng再加上位图字库就够用。
步骤:
* 修改src/Makefile,去除zlib、libpng、pixman、cairo、freetype、chipmunk相关的行;
* 编译一下,根据编译错误删除代码里引用到图形库的地方(比如do_showlogo)。

4. 去除shell、command功能,尺寸减到371kB。开发、调试时可以用用shell,正式产品不需要保留。
步骤:
* 修改src/Makefile,去除shell、command;
* 删除src/arch/arm32/lib/cpu/cmd-*.c,或移到另外的目录里;
* 删除掉main()中的do_showlogo、do_autoboot、run_shell调用,改为直接调用实际的应用代码入口;
* 编译一下,根据编译错误删除代码里几处引用到system()的地方。

5. 去除不用的驱动,尺寸减到308kB。根据自己的应用需求,删除不必要的驱动。
步骤:
* 修改src/Makefile,去除用不到的driver/xxx,我这里只保留了block、时钟、console、dma、gpio、i2c、interrupt、pwm、reset、spi、uart、watchdog等常用外设驱动;
* 删除mach-f1c100s/driver里不用的驱动,或移到单独的目录里。

6. 去除不用的库,尺寸减到277kB。
步骤:
* 修改src/Makefile,去除libc/charset、libc/crypto、fs/xfs(视自己的需要删除);
* 删除代码里引用到的地方。

7. 链接时去除未用到的符号,尺寸减到170kB。XBOOT自带的libc和libm函数都通过EXPORT_SYMBOL宏加到了.ksymtab.text段,所以即使在代码中没有调用到,链接时也无法优化掉,白白占用空间。这个设计本意是为了编译动态链接库,不过在当前的XBOOT中并没有使用。
步骤:
* 修改module.h,把EXPORT_SYMBOL宏定义为空,即:#define EXPORT_SYMBOL(symbol);
* 修改mach-f1c100s/xboot.mk,给LDFLAGS增加“-Wl,--gc-sections”,给MCFLAGS增加“-ffunction-sections -fdata-sections”,让链接器删除未用到的符号。

8. 去除文件系统。鉴于这个改动涉及很多零散的点,且大多数应用都会需要文件系统,所以不建议这样改。如果实在有必要,可以把所有的fs和block驱动去掉,尺寸减到131kB

以上为功能裁剪和链接优化方法。

资源打包

如果程序中需要用到大量资源,资源文件默认是放在romdisk中,会增加启动时间。一个可采取的优化措施是,把非必要的资源单独放在另一个romdisk中,在启动后异步加载。(还未实际验证过)

先分析XBOOT的代码,和romdisk相关的有如下几处:
* src/Makefile最后,sinclude这句,把源码的某个目录拷贝到.obj中,用cpio命令把目录打包成单个文件;
* driver/block/romdisk/data.S和mach-f1c100s/xboot.ld,把打包后的romdisk文件链接到单独的“.romdisk”段;
* 启动时,sys_copyself中把__image_start和__image_end两个符号之间的内容拷贝到RAM,如上所说.romdisk段也在此范围内;
* subsys_init_romdisk中,用__romdisk_start和__romdisk_end符号之间的内存创建romdisk,并在subsys_init_rootfs中挂载到“/”。

因此,优化方法是,将非必须(启动不需要)的资源文件打包到另一个romdisk,挂载到单独的目录下使用。大致做法如下:
* 启动过程中必须的资源仍然放在默认romdisk中;
* 启动非必须的资源单独放到一个源码目录,通过Makefile cpio打包成单个文件;
* xboot.ld中添加“.dataromdisk”段,参照XBOOT的做法,用一个.S文件把上一步的打包文件链接到.dataromdisk段;该段位于.data段之后,因此启动的时候不会被sys_copyself拷贝;
* 系统启动之后,参照sys_copyself的方法,把.dataromdisk段拷到RAM;
* 按照subsys_init_romdisk和subsys_init_rootfs的做法,初始化另一个romdisk,挂载到“/data”。

离线

#2 2018-10-04 23:13:03

basicdev
会员
注册时间: 2017-10-02
已发帖子: 159
积分: 159

Re: XBOOT尺寸裁剪(170kB不带图形系统)

不错不错,又get 到新技能...

离线

#3 2018-10-04 23:21:40

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,138
积分: 1090.5

Re: XBOOT尺寸裁剪(170kB不带图形系统)

由于我要用到矢量图形库,所以最大头的2MB没法裁剪。。

离线

#4 2018-10-06 18:42:02

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

Re: XBOOT尺寸裁剪(170kB不带图形系统)

厉害,感谢楼主分享!





离线

#5 2018-10-06 23:42:52

gdfsli
会员
注册时间: 2018-07-11
已发帖子: 28
积分: 28

Re: XBOOT尺寸裁剪(170kB不带图形系统)

[LD] Linking ../output/xboot
arm-linux-gnueabi-gcc: error: unrecognized command line option ‘-Wl’; did you mean ‘-W’?
arm-linux-gnueabi-gcc: error: unrecognized command line option ‘--gc-sections’; did you mean ‘--data-sections’?

离线

#6 2018-10-06 23:46:09

gdfsli
会员
注册时间: 2018-07-11
已发帖子: 28
积分: 28

Re: XBOOT尺寸裁剪(170kB不带图形系统)

原来-Wl,--gc-sections中间不能有空格

离线

#7 2019-01-29 08:33:22

motoedy
会员
注册时间: 2018-05-16
已发帖子: 14
积分: 44

Re: XBOOT尺寸裁剪(170kB不带图形系统)

大佬能分享下你裁剪后的工程么?

离线

楼主 #8 2019-01-29 10:40:14

Quotation
会员
注册时间: 2018-10-04
已发帖子: 296
积分: 264.5

Re: XBOOT尺寸裁剪(170kB不带图形系统)

motoedy 说:

大佬能分享下你裁剪后的工程么?

这是我的工程,删了一些不用的文件和第三方库。如果你需要,再对照原始的工程添加回来。
编译出来的bin文件133kB。
xboot-size-opt.zip

离线

#9 2019-01-29 10:50:00

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

Re: XBOOT尺寸裁剪(170kB不带图形系统)

Quotation 说:
motoedy 说:

大佬能分享下你裁剪后的工程么?

这是我的工程,删了一些不用的文件和第三方库。如果你需要,再对照原始的工程添加回来。
编译出来的bin文件133kB。
xboot-size-opt.zip

感谢大神分享!





离线

#10 2019-01-29 11:05:58

motoedy
会员
注册时间: 2018-05-16
已发帖子: 14
积分: 44

Re: XBOOT尺寸裁剪(170kB不带图形系统)

Quotation 说:
motoedy 说:

大佬能分享下你裁剪后的工程么?

这是我的工程,删了一些不用的文件和第三方库。如果你需要,再对照原始的工程添加回来。
编译出来的bin文件133kB。
xboot-size-opt.zip

感谢大佬分享!

离线

#11 2019-09-26 13:05:34

zenghaibo
会员
注册时间: 2019-07-15
已发帖子: 63
积分: 57

Re: XBOOT尺寸裁剪(170kB不带图形系统)

学习

离线

#12 2019-11-07 21:08:20

gui401
会员
注册时间: 2019-10-25
已发帖子: 45
积分: 29.5

Re: XBOOT尺寸裁剪(170kB不带图形系统)

Quotation 说:
motoedy 说:

大佬能分享下你裁剪后的工程么?

这是我的工程,删了一些不用的文件和第三方库。如果你需要,再对照原始的工程添加回来。
编译出来的bin文件133kB。
xboot-size-opt.zip

楼主你好,我在你的这个工程while循环里加了sys_uart_putc('A'); 编译后把bin下载到flash 但串口没看到有打印,请问是怎么回事呢?

离线

#13 2019-11-10 18:41:40

oayzw
会员
注册时间: 2019-04-08
已发帖子: 23
积分: 8

Re: XBOOT尺寸裁剪(170kB不带图形系统)

是否能考虑把makoserver集成进来?

最近编辑记录 oayzw (2019-11-10 18:46:14)

离线

#14 2019-11-10 21:03:42

nuvoton
会员
注册时间: 2019-06-17
已发帖子: 59
积分: 59

Re: XBOOT尺寸裁剪(170kB不带图形系统)

oayzw 说:

是否能考虑把makoserver集成进来?

makoserver 是啥?

离线

#15 2019-11-11 11:55:11

oayzw
会员
注册时间: 2019-04-08
已发帖子: 23
积分: 8

Re: XBOOT尺寸裁剪(170kB不带图形系统)

https://makoserver.net/

具有Lua支持的嵌入式web server吧,替代UI有可能?

离线

#16 2019-11-11 13:14:32

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,138
积分: 1090.5

Re: XBOOT尺寸裁剪(170kB不带图形系统)

不可能,UI是前端浏览器渲染的,webserve只是提供数据而已,不负责渲染

离线

#17 2019-11-11 13:54:46

oayzw
会员
注册时间: 2019-04-08
已发帖子: 23
积分: 8

Re: XBOOT尺寸裁剪(170kB不带图形系统)

就是把复杂的ui剥离,放到浏览器上去,而浏览器是不需要开发的

离线

#18 2019-12-30 22:48:10

iamkylin
会员
注册时间: 2019-10-09
已发帖子: 16
积分: 4

Re: XBOOT尺寸裁剪(170kB不带图形系统)

感谢楼主分享!

离线

#19 2019-12-31 11:20:00

转角1068
会员
注册时间: 2019-12-14
已发帖子: 6
积分: 5

Re: XBOOT尺寸裁剪(170kB不带图形系统)

感谢大佬分享。

离线

#20 2020-05-22 21:57:45

瓷老虎
会员
注册时间: 2020-05-13
已发帖子: 1
积分: 1

Re: XBOOT尺寸裁剪(170kB不带图形系统)

这个可以有,本来想在v3s上裸奔,但是裸奔软件工作量有点大,只能裁剪xboot,

离线

#21 2021-11-08 00:57:03

hxtuo
会员
注册时间: 2021-11-08
已发帖子: 1
积分: 1

Re: XBOOT尺寸裁剪(170kB不带图形系统)

该评论内容与本帖子无关,鼓励各位坑友积极发言讨论与帖子有关的内容!

离线

  • 不通过:其他

#22 2021-11-12 10:02:22

jjxyfzhy
会员
注册时间: 2021-02-08
已发帖子: 6
积分: 1

Re: XBOOT尺寸裁剪(170kB不带图形系统)

该评论内容与本帖子无关,鼓励各位坑友积极发言讨论与帖子有关的内容!

离线

  • 不通过:其他

#23 2021-11-14 12:20:51

vigour1000
会员
注册时间: 2018-11-19
已发帖子: 101
积分: 2

Re: XBOOT尺寸裁剪(170kB不带图形系统)

有引导内核功能吗?

离线

#24 2022-06-01 18:48:39

超级网吧
会员
注册时间: 2022-03-29
已发帖子: 5
积分: 0

Re: XBOOT尺寸裁剪(170kB不带图形系统)

每天都是追寻大佬脚步的看帖:D

离线

#25 2022-06-01 19:45:32

hameyou
会员
注册时间: 2018-04-15
已发帖子: 196
积分: 8.5

Re: XBOOT尺寸裁剪(170kB不带图形系统)

引导内核应该可以,初始化DDR,复制到内核映像、设备树,到DDR,挂载根文件系统

离线

#28 2022-06-19 23:03:30

go369
会员
注册时间: 2022-06-07
已发帖子: 24
积分: 60

Re: XBOOT尺寸裁剪(170kB不带图形系统)

撸一个类似 make menuconfig 可视化配置勾选就方便了。

离线

#29 2022-09-15 08:30:42

mind
会员
注册时间: 2022-08-16
已发帖子: 6
积分: 1

Re: XBOOT尺寸裁剪(170kB不带图形系统)

是的,配置文件也行:D

离线

#30 2022-09-18 19:11:46

anyi
会员
注册时间: 2022-08-30
已发帖子: 5
积分: 31

Re: XBOOT尺寸裁剪(170kB不带图形系统)

最近刚入坑T113,xboot是目前最合适的学习资源,有精简版最好了

离线

#31 2022-10-23 03:33:01

endymoin
会员
注册时间: 2022-01-19
已发帖子: 3
积分: 3

Re: XBOOT尺寸裁剪(170kB不带图形系统)

可否分享一下xboot的工程

离线

#33 2023-08-08 13:40:50

cz_jjq
会员
注册时间: 2023-04-20
已发帖子: 4
积分: 4

Re: XBOOT尺寸裁剪(170kB不带图形系统)

正在学习xboot,感谢楼主给了裁剪的方法

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn