解决:LVGL+GUI Guider 1.7.2运行一段时间就会卡死死机,内存泄露溢出的问题

概括:

        我在使用NXP官方GUI Guider生成的代码出现了内存泄漏的问题。但我遇到的并不是像其他人所说的style的问题,如下链接。而是因为在页面渲染之前就使用了该页面内的组件,内存就会不断增加。

LVGL 死机 内存泄漏_lvgl 内存溢出-CSDN博客

运行环境:

        stm32f407+LVGL8.3+GUI-Guider-1.7.2-GA

现象:

         我设计了3个页面,单片机上电只会加载wifi页面,另两个页面并未加载:

        打开lvgl的配置文件Iv_conf.h,开启 #define LV_USE_MEM_MONITOR 1 内存监控,发现内存在不断增加,出现内存泄漏的问题,直到内存耗尽到系统崩溃,看门狗复位单片机,如下图:

        用memory_print()测试也是一样:

代码参考:https://blog.csdn.net/mygod2008ok/article/details/11030377

/**
*  @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);
}

原因:

        GUI-Guider生成的代码中,setup_ui()中只有setup_scr_wifi(ui),也就是说初始化时默认只渲染了wifi一个页面:

        如果用GUI-Guider设计,如果勾选了 load screen,其他页面会在我们点击按钮后才加载(包括渲染和跳转):

        因为我用了定时器,所以单片机上电一秒后就会执行,但此时home页面还没被渲染,所以内存就会不断增加:

推荐:解决方法1(切换页面时渲染新的,删除旧的):

1. 可以设置一个全局变量表示当前是什么页面,在修改lvgl组件的代码之前判断一下。

if(strcmp(CurrentPage, "home") == 0)

2. GUI-Guider 勾选上 load screen 和 删除当前页面,会生成以下代码:

ui_load_scr_animation(&guider_ui, &guider_ui.home, guider_ui.home_del, &guider_ui.wifi_del, setup_scr_home, LV_SCR_LOAD_ANIM_NONE, 0, 0, false, true);

最后的参数ture表示删除旧页面。

该函数内部主要包括以下两行,其实也可以直接用下面两行:

setup_scr_home(&guider_ui) // 渲染新页面 
lv_scr_load_anim(guider_ui.home, LV_SCR_LOAD_ANIM_NONE, 0, 0, true); // 删除旧页面、跳转到新页面

3. 更改当前页面:

sprintf(CurrentPage,"%s","wifi");

解决方法2(缺点是所有页面都会被渲染,浪费单片机宝贵的RAM):

        经过实验,如果在main()中初始化那里提前setup_scr_home(ui),内存就不会增加了:

        1. 在main() 函数中,加上下图红框里的代码:

        2. GUI-Guider取消勾选 load screen

页面跳转,使用:

lv_scr_load_anim(guider_ui.home, LV_SCR_LOAD_ANIM_NONE, 0, 0, false);

false是指不删除旧页面。

初学LVGL,如有不对,请指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值