如何一步一步地优化LVGL的flash占用 |
您所在的位置:网站首页 › 2k21内存太大 › 如何一步一步地优化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吧。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |