文章目录
- 问题描述:
- 问题解决
- 更改LVGL RAM缓存大小
- 看ESP32的RAM使用情况
- 参考链接
问题描述:
使用LVGL可显示64 * 64的GIF,但是却无法显示120*120的GIF。
问题解决
更改LVGL RAM缓存大小
分析原因:在用LVGL显示GIF图片时,会用到LVGL的GIF解码器,该解码器要求的空间大小如下:
因此,对于6464的GIF图片,其需要的RAM空间为:$64 \times 64 \times4\div 1024=16K bytes$
对于120120的GIF,其需要的RAM空间为:$120 \times 120 \times4\div 1024=56.25K bytes$
按理来说,ESP32的RAM空间有512KB,是足够解码器使用的。
看LVGL的lv_conf.h文件我们可以发现,里面限制了LVGL可以使用的最大RAM空间,即通过malloc可以申请的最大空间:
其默认为48K,因此对于120*120的GIF,就无法进行解码,也就无法显示了。将其改为128K,问题就解决了。
看ESP32的RAM使用情况
在ESP32中,在总线上分为了数据内存总线(DRAM、DROM)和指令内存总线(IRAM、IROM),指令存储器是可执行的,只能通过4字节对齐的字来读写。数据内存是不可执行的,可以通过单个字节操作访问。
一般来说,DRAM用来存储可读可写的数据,IRAM用来存储只读数据。
在我们的程序中,数据一般被存在以下3个分区中:
- 静态区(全局变量区):程序的全局变量和静态变量
- 栈:函数内部的局部变量
- 堆:即动态内存区,有malloc()和free()进行内存的申请释放,需要手动进行释放。
在我们使用LVGL时,所设置的LV_MEM_SIZE即为堆大小,其由DRAM的一部分和IRAM的一部分共同组成,上电时其会打印堆区信息如下:
其中D/IRAM是既可以做指令RAM又可以做数据RAM的区域。
我们可以通过idf.py来查看ESP32编译后的内存使用情况:
idf.py size
Total sizes:
Used static DRAM: 163500 bytes ( 17236 remain, 90.5% used)
.data size: 9476 bytes
.bss size: 154024 bytes
Used static IRAM: 58490 bytes ( 72582 remain, 44.6% used)
.text size: 57463 bytes
.vectors size: 1027 bytes
Used Flash size : 443899 bytes
.text : 308963 bytes
.rodata : 134680 bytes
Total image size: 511865 bytes (.bin may be padded larger)
参考链接
LVGL官网显示GIF教程
ESP32的内存学习
ESP32的堆区内存说明