LVGL:Out of memory,can‘t allocate a new buffer (increase your LV_MEM_SIZE/heap size)

  • 之前有学长拿 LVGL 做毕设,但是多次进入触摸屏次级页面后,会出现卡死的问题。
  • 这几天我也在拿 LVGL 做课设,时不时也会出现上述问题(有时候我当做没看见,重新复位就过去)。但是,这不是做科研的态度。。
  • 于是咨询了老学长当时是怎么解决的,他说,当时出现这个问题后,放弃了LVGL。。。

今天在经过不断的尝试后,终于解决了这个问题,下面分享一下我的探索历程。


首先我在KEIL中进入调试,开启全速运行,然后多次触摸屏幕进入次级页面,进而引发屏幕卡死。屏幕卡死后,我点击结束全速运行,然后程序就跳到了这一行代码中:

Out of memory,can't allocate a new buffer (increase your LV_MEM_SIZE/heap size)

内存溢出,不能分配一块新的缓冲区(增大你的LV_MEM_SIZE/堆 大小)
在这里插入图片描述
不过我这是多次点击屏幕重复加载页面后才出现的屏幕卡死问题,所以和硬件本身的内存大小无关,而是说每次进入页面,对内存的使用是累加型的,每进入一次,内存就少一点,直至报错(即经典的内存泄漏问题)。


带着这行代码,我进入百度搜索,搜不到相关解释…
于是在想是否是 task 任务的问题,因为我设置了两个全局的 task 变量,但是在注释后,并未发现明显变化。。


于是,带着疑问,进入 LVGL官方论坛 ,搜索我的报错警告,发现了这个和我相同情况的帖子Turn the whole page,帖子下的大佬是这么回应的:
在这里插入图片描述
大致意思是:你每次都重新初始化这个样式,在第一次初始化之后,应该调用lv_style_reset,而不是继续调用lv_style_init,这将导致内存泄漏。

回去查看 GUI GUIDER 生成的代码,果然!在每次进入另一个屏幕页面时,就会重新调用样式初始化函数!


对此,我尝试在第二次或以后多次进入屏幕页面时,调用 lv_style_reset 这个函数,但是样式都会回归初始配置,不好看…
于是经过多次尝试后,解决了这个问题!


下面附上代码参考:

#include "lvgl/lvgl.h"
#include "gui_guider.h"
#include "events_init.h"

unsigned int buka_home=1;

void setup_scr_Screen_Home(lv_ui *ui)
{
	/*
	这里放下面注释掉的样式创建函数行。
	*/
	if(buka_home==1)
	{
		buka_home=0;
		/*
		这里放下面注释掉的样式初始化函数。
		*/
	}
	else ;
	
 	/*
 	生成的相关代码
	记住:要把这里的所有 样式创建函数行static lv_style_t xxx 和样式初始化函数lv_style_init(&xxx)  注释掉!!!
	*/


	//Init events for screen
	events_init_Screen_Home(ui);
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值