LVGL 死机 内存泄漏

利用NXP官方UI生成软件生成的代码有内存泄漏的问题。LVGL V7.9
群里每隔段时间都有新人入此坑,啰啰嗦嗦半天效率极低。贴出本人实践过的方法,上次项目共有十多个页面,长时间切换均正常,解决思路是参考官方历lv_demo_widgets。

介于项目是很久前做的,随手找了个代码做分析,此段代码源自于https://blog.csdn.net/mygod2008ok/article/details/110303775

void win_test1(void)
 {
     lv_obj_t* scr = lv_obj_create(NULL, NULL);
     lv_obj_set_size(scr, LV_HOR_RES, LV_VER_RES);
     static lv_style_t style;   //样式
     lv_style_init(&style);
     lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
     lv_style_set_text_color(&style, LV_STATE_DEFAULT, LV_COLOR_WHITE);
     lv_obj_add_style(scr, LV_OBJ_PART_MAIN, &style);

     lv_obj_t* label = lv_label_create(scr, NULL);
     lv_obj_set_auto_realign(label, true);  // 自动对齐
     lv_obj_align(label, scr, LV_ALIGN_CENTER, 0, 0);
     lv_obj_add_style(label, LV_LABEL_PART_MAIN, &style);

     lv_label_set_text(label, "This is a test 1");

     lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_FADE_ON, 400, 0, true); // 动画加载屏幕并删除之前的屏幕
     printf("win test 1 is created ");
     memory_print();  //内存打印
 }

void win_test2(void)
 {
     lv_obj_t* scr = lv_obj_create(NULL, NULL);
     lv_obj_set_size(scr, LV_HOR_RES, LV_VER_RES);
     static lv_style_t style;  //样式
     lv_style_init(&style);
     lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE);
     lv_style_set_text_color(&style, LV_STATE_DEFAULT, LV_COLOR_WHITE);
     lv_obj_add_style(scr, LV_OBJ_PART_MAIN, &style);

     lv_obj_t* label = lv_label_create(scr, NULL);
     lv_obj_set_auto_realign(label, true);  // 自动对齐
     lv_obj_align(label, scr, LV_ALIGN_CENTER, 0, 0);
     lv_obj_add_style(label, LV_LABEL_PART_MAIN, &style);

     lv_label_set_text(label, "This is a test 2");
     
     lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_FADE_ON, 400, 0,true);  // 动画加载屏幕并删除之前的屏幕
     printf("win test 2 is created ");
     memory_print();  //内存打印
 }

修改后的

static lv_style_t style1;   //样式1
static lv_style_t style2;  //样式2

void my_lv_style_t_init(void)
{
     lv_style_init(&style1);
     lv_style_init(&style2);
}

void win_test1(void)
 {
     lv_obj_t* scr = lv_obj_create(NULL, NULL);
     lv_obj_set_size(scr, LV_HOR_RES, LV_VER_RES);

     lv_style_set_bg_color(&style1, LV_STATE_DEFAULT, LV_COLOR_RED);
     lv_style_set_text_color(&style1, LV_STATE_DEFAULT, LV_COLOR_WHITE);
     lv_obj_add_style(scr, LV_OBJ_PART_MAIN, &style1);

     lv_obj_t* label = lv_label_create(scr, NULL);
     lv_obj_set_auto_realign(label, true);  // 自动对齐
     lv_obj_align(label, scr, LV_ALIGN_CENTER, 0, 0);
     lv_obj_add_style(label, LV_LABEL_PART_MAIN, &style1);

     lv_label_set_text(label, "This is a test 1");

     lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_FADE_ON, 400, 0, true); // 动画加载屏幕并删除之前的屏幕
     printf("win test 1 is created ");
     memory_print();  //内存打印
 }

void win_test2(void)
 {
     lv_obj_t* scr = lv_obj_create(NULL, NULL);
     lv_obj_set_size(scr, LV_HOR_RES, LV_VER_RES);
     
     lv_style_set_bg_color(&style2, LV_STATE_DEFAULT, LV_COLOR_BLUE);
     lv_style_set_text_color(&style2, LV_STATE_DEFAULT, LV_COLOR_WHITE);
     lv_obj_add_style(scr, LV_OBJ_PART_MAIN, &style2);

     lv_obj_t* label = lv_label_create(scr, NULL);
     lv_obj_set_auto_realign(label, true);  // 自动对齐
     lv_obj_align(label, scr, LV_ALIGN_CENTER, 0, 0);
     lv_obj_add_style(label, LV_LABEL_PART_MAIN, &style2);

     lv_label_set_text(label, "This is a test 2");
     
     lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_FADE_ON, 400, 0,true);  // 动画加载屏幕并删除之前的屏幕
     printf("win test 2 is created ");
     memory_print();  //内存打印
 }

经查,在两个界面切换造成内存泄漏的原因是样式多次初始化,且清屏函数lv_obj_clean(lv_scr_act());释放不了样式内存,故把所有的样式单独挑出来完成一遍初始化,以后的切屏中直接调用即可。所以,my_lv_style_t_init()函数执行的位置也很明显了,在LVGL系统初始化完成后,准备载入屏幕控件以前调只用一次即可,只调用一次,只调用一次。(重要的事情复读机)

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值