LVGL 内存分为两种:管理内存和绘图缓冲区
1、管理内存是在lv_conf.h 中配置,建议使用内部sdram,外在外置内存比较慢。
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
/* `lv_mem_alloc()`可获得的内存大小(以字节为单位)(>= 2kB) */
#define LV_MEM_SIZE (48U * 1024U) /*[字节]*/
2、可以把管理内存放在CCM内存中,这个内存存在STM32F407 系列中,ccm内存是直接连接cpu的,速度最快!!
在lv_conf.h 中配置配置方式如下:
还要在keil中勾选iram。如果不勾选也不会出现问题。刚刚测试也是可以的!!比较奇怪。记录一下!
注意:
如果使用原子例程,一定要把原子的内存管理文件去掉(malloc.c )。否则会报错。这个malloc.c 文件编译地址会和lvgl使用CCM地址冲突,导致无法编译!!
验证是否在使用ccm内存,在系统任务中创建指针,选择用lv_mem.c文件中内存申请函数,串口打印地址!
串口打印如下,可以看到地址信息是0x1000 0000 开头地址和0x2000 0000 。
/
3、管理内存放在外置SDRAM中,比较慢,只需要把地址改成 (0x68000000)即可
#define LV_MEM_ADR (0x68000000) /*0: 未使用*/
其他和上面1一样!
4、绘图缓冲区
这个内存在lv_port_disp_template.c 文件中修改。下图是使用内部内存。使用外部地址修养在数组后面写上地址 __attribute__((at(0x68000000)))。
例如。这个是双缓冲区,用的是外部SDRAM,大小是1mb。这样就可以开全尺寸缓冲区!!
注意:双缓冲区,第二个需要加上第一个缓冲区的大小,就是屏幕像素(例如 320*240)* 2 ,2是像素大小(彩色屏一般是16bit或者32bit)。我这里屏幕是320*240,使用彩色是16bit(RBG565)。
/* 全尺寸双缓冲区示例) 并且在下面设置 disp_drv.full_refresh = 1 */
static lv_disp_draw_buf_t draw_buf_dsc_3;
static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES] __attribute__((at(0x68000000))); /* 设置一个全尺寸的缓冲区 */
static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES] __attribute__((at(0x68000000 + MY_DISP_HOR_RES * MY_DISP_VER_RES * 2))); /* 设置另一个全尺寸的缓冲区 */
lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, MY_DISP_HOR_RES * MY_DISP_VER_RES);/* 初始化显示缓冲区 */
总结;
1、如果内存管理方面,出现问题,考虑可能是原子的内存管理问题(malloc.c )。去掉这个问题,重新编译就会正常!/
2、ccm内存,在配置时候超过 64k,也不会报错!可以问题就是编译器问题!后面这个使用时候,需要注意。这里记录一下。