MCU:ESP32S3
CSDK:ESP-IDFV5.0.1
图形:LVGL8.3.5
- 报错一般如下:
第一种原因
- 如果你未勾选上图的位置,说明你未使用系统的内存分配方式(stdlib.h),而是用了LVGL的内存分配方式。这时会出现一个问题,lvgl内置内存管理模块初始化的内存池的大小可以自定义设置,若设置过大则会导致报错overflowed。适当减小即可,代价是显示控件减少。
- 以下为关于LVGL内存分配的两套方案解释(摘自:https://www.rstk.cn/news/358058.html):lvgl的内存分配和释放提供了两套方案,可以通过lv_conf.h头文件中的宏LV_MEM_CUSTOM来控制使用哪个方案,该宏定义值为0,则表示使用lvgl内置的内存分配函数lv_mem_alloc()和lv_mem_free();该宏定义值为1,则表示使用自定义“malloc()/free()/realloc()”,根据代码中的逻辑,其实就是使用系统标准的动态内存分配函数malloc()/free()/realloc(),这些标准函数此处不细说,这里要重点说一下lvgl的内置内存管理的函数。
- lvgl默认配置就是使用其内置的内存管理函数,根据头文件中定义及相关注释,使用内置的内存管理函数,需要用到内存块大小定义的宏LV_MEM_SIZE,按照注释说明,此值必须大于2kb,此宏的值默认为32U * 1024U,即32kb。此内存大小为lvgl内置内存管理模块初始化的内存池的大小,对后续的界面显示有一定的影响。
- 在代码中位置如下图:
第二种原因
有可能是因为屏幕的单、双缓冲区设置过大,如下图我如果设置为200,这时就会出现overflowed,调小至适当值即可:
第三种原因
使用例如自定义组件时显示区域设置过大,申请的内存过大导致overflowed,适当减小组件显示大小即可解决:
其它可能的原因(遇到了再补充)
其它原因比如static变量过多(一般不会)内存溢出时应该不会超出特别多,如果超出不是特别多的话,就要考虑检查优化下自己的代码了。