ESP32 LVGL:无法显示过大的GIF图片(修改VLGL RAM缓存大小)

文章目录

  • 问题描述:
  • 问题解决
    • 更改LVGL RAM缓存大小
    • 看ESP32的RAM使用情况
  • 参考链接

问题描述:

使用LVGL可显示64 * 64的GIF,但是却无法显示120*120的GIF。

问题解决

更改LVGL RAM缓存大小

分析原因:在用LVGL显示GIF图片时,会用到LVGL的GIF解码器,该解码器要求的空间大小如下:
ESP32 LVGL:无法显示过大的GIF图片(修改VLGL RAM缓存大小)_第1张图片
因此,对于6464的GIF图片,其需要的RAM空间为: 64 × 64 × 4 ÷ 1024 = 16 K b y t e s 64\times64 \times4\div1024=16K bytes 64×64×4÷1024=16Kbytes
对于120
120的GIF,其需要的RAM空间为: 120 × 120 × 4 ÷ 1024 = 56.25 K b y t e s 120 \times 120 \times4\div 1024=56.25K bytes 120×120×4÷1024=56.25Kbytes
按理来说,ESP32的RAM空间有512KB,是足够解码器使用的。
看LVGL的lv_conf.h文件我们可以发现,里面限制了LVGL可以使用的最大RAM空间,即通过malloc可以申请的最大空间:
ESP32 LVGL:无法显示过大的GIF图片(修改VLGL RAM缓存大小)_第2张图片
其默认为48K,因此对于120*120的GIF,就无法进行解码,也就无法显示了。将其改为128K,问题就解决了。

看ESP32的RAM使用情况

在ESP32中,在总线上分为了数据内存总线(DRAM、DROM)和指令内存总线(IRAM、IROM),指令存储器是可执行的,只能通过4字节对齐的字来读写。数据内存是不可执行的,可以通过单个字节操作访问。
一般来说,DRAM用来存储可读可写的数据,IRAM用来存储只读数据。
在我们的程序中,数据一般被存在以下3个分区中:

  • 静态区(全局变量区):程序的全局变量和静态变量
  • 栈:函数内部的局部变量
  • 堆:即动态内存区,有malloc()和free()进行内存的申请释放,需要手动进行释放。

在我们使用LVGL时,所设置的LV_MEM_SIZE即为堆大小,其由DRAM的一部分和IRAM的一部分共同组成,上电时其会打印堆区信息如下:
ESP32 LVGL:无法显示过大的GIF图片(修改VLGL RAM缓存大小)_第3张图片
其中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的堆区内存说明

你可能感兴趣的:(#,ESP32开发,lvgl,ESP32,单片机,stm32)