LVGL使用的空间包括内存和Flash。
其中,内存分为LVGL管理的内存空间+还有一部分是刷新的缓冲区。如果内存够用,两块空间可以都放到内部RAM,如果内部RAM不够用,就可以将刷新缓冲区放到外部RAM中,然后使用全屏刷新,用空间换时间。
而flash也分为两部分,一部分是代码,另一部是是素材文件,一般lvgl使用的素材主要有图片和字体,这些数据稍微多一些就很容易导致内部flash不够用。
这种情况下要怎么办呢?
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吧。