如何一步一步地优化LVGL的flash占用

LVGL使用的空间包括内存和Flash。

其中,内存分为LVGL管理的内存空间+还有一部分是刷新的缓冲区。如果内存够用,两块空间可以都放到内部RAM,如果内部RAM不够用,就可以将刷新缓冲区放到外部RAM中,然后使用全屏刷新,用空间换时间。

而flash也分为两部分,一部分是代码,另一部是是素材文件,一般lvgl使用的素材主要有图片和字体,这些数据稍微多一些就很容易导致内部flash不够用。

这种情况下要怎么办呢?

参考:如何在资源有限的MCU上进行图形应用设计 - 控制/MCU - 电子发烧友网

1

当前市面上有一种flash烧录器,但只能离线烧录(即在flash未焊接的情况下烧录),烧录结束再将flash给焊接到板子上,参考:

https://jingyan.baidu.com/article/27fa7326ef938107f8271f97.html

这种方式局限性太大。

2

外部flash读取,适合能用SD卡的情况,将素材数据拷贝到SD卡中,然后读取存入外部flash中,接着从外部flash中读取数据。不过,外部flash读取速度相比内部flash较慢。

3

考虑使用内部flash容量更高的芯片,可以不损失读取速度。

在没有SD卡的情况下,这种方式是较为合适的。

先看看程序占用了多少的空间

我用的是F407ZET6的单片机,FLASH空间为512K,编译后提示flash空间不足。

此时,无法查看到底占用了多少flash空间。

之后,为了确认到底需要多少的flash空间,在keil中,将设备从ZET6强行改成ZGT6,然后编译,发现占用空间为953.45kB

我们看看都是哪些地方占用了空间。

对lvgl进行初始化之前,整个代码占用空间为4k

进行lvgl初始化之后,就变成了将近200k

然后添加所有的页面和图片并使用起来,猛地增加了300k的空间占用

然后应用各种字体,瞬间又增加了360k的空间

可见,图片和字体所占的空间太大,占比约为90%。

优化空间占用

接下来,我们就看看有哪些优化的空间。

原来的空间占用为953k

第一步,去掉LVGL不必要的内容,我们可以在lv_conf.h中将不要的功能都置0,主要是不用的日志、断言、组件、布局、三方库,只留下基本的标签、图片、按钮、线条等部件。

比如:

去掉后下降了90k,变成865k

第二步,最大限度将用到的图片进行手动绘制。

有些较为规则的图片图案,可以使用矩形和线条来绘制。

将图片从13张优化到n张,并减小部分图片的尺寸

优化之前

优化之后

此时占用flash空间下降了150k,变成709k

可见,下降并不是很明显,这是因为全屏幕的logo占用空间太大。

这里有个问题要注意下,那就是无论怎么将图片压缩或者更换格式,都不会改变原始数据的大小,只要图片尺寸确定,颜色深度确定,那么大小就是确定的。

第三步,将有些能用图标字体代替图片的用图标字体来替换

具体参考这篇文章。

替换之后,只留下了一张全屏logo,其他都用图标字体来替换了

可以看到,竟然增长了将近80k的空间

这是为什么呢?

因为小图标图片占用内存空间并不算太多,而且一张图片到处使用即可。

但是字体本身占的空间也并不比图片少,而且字体每存在一个大小,就会多一个字库。

总结下来,其实就几点:

1、失能lvgl不必要的部件;

2、尽可能使用绘制来代替图片;

3、实在没法绘制的小图标就直接使用图片;

另外,还可以直接弄一个写flash工程,将不经常刷新的图片素材写到外部flash中,为什么要单独弄一个呢?因为直接在工程里写flash,容易导致每次烧录程序都要写一遍。

其实还有个方式,那就是开启keil的优化等级,只不过这种情况下需要注意一些变量的volatile处理,而且优化也并不明显,能大概下降个二三十k吧。

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值