lvgl V7.7.2内存泄漏问题

RAM内存打印

lvgl由lv_mem_alloc函数分配的内存后,系统在运行后的内存使用状况,需要一个函数来打印相关信息,打印函数如下

/**
*  @brief print memory useage state
*  @param[in] void
*  @returnval  void
*/
void memory_print(void)
{
    lv_mem_monitor_t mon;
    lv_mem_monitor(&mon);
    printf("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n", (int)mon.total_size - mon.free_size,
                mon.used_pct,
                mon.frag_pct,
                (int)mon.free_biggest_size);
}

创建两个窗口来测试一下内存消耗

  • 窗口1函数如下
 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();  //内存打印
 }
  • 窗口2函数如下
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();  //内存打印
 }

现在来测试一下2个窗口变换的内存消耗

  • 在main函数中先加载一个空屏幕
lv_obj_set_size(lv_obj_create(lv_scr_act(), NULL), LV_HOR_RES, LV_VER_RES);
  • 在main函数的主循环中加入代码测试,主循环中的内容如下
while (1) {
        /* Periodically call the lv_task handler.
        * It could be done in a timer interrupt or an OS task too.*/
        lv_task_handler();
        Sleep(10);       /*Just to let the system breathe */
        static uint16_t i;
        if (++i > 100) {
            i = 0;
            static bool flag;
            if (flag)
            {
                flag = false;
                win_test2();
            }
            else
            {
                flag = true;
                win_test1();
            }
            
      }
    }

运行效果图及内存消耗情况

效果图

  • 以上窗口每创建一次会使内存增加,造成内存泄漏,直到内存耗尽导到系统崩溃,出现内存泄漏的原因是lv_style_t定义的style变量中所保存的内存没有释放造成,由于调用lv_style_init(&style)函数后,窗口即使删除了,style变量保存的地址块指向的内存没有释放,解决方法是,在调用lv_style_init(&style)函数之前调用 lv_style_reset(&style);
    分别修改后的win_test1和win_test2如下
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_reset(&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_reset(&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();  //内存打印
 }

修改后运行的效果图及内存消耗状况

在这里插入图片描述

  • 修改后上内存不再增加,如有错误,欢迎留言指导纠正
  • 19
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

风雨依依

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

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

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

打赏作者

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

抵扣说明:

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

余额充值