概括:
我在使用NXP官方GUI Guider生成的代码出现了内存泄漏的问题。但我遇到的并不是像其他人所说的style的问题,如下链接。而是因为在页面渲染之前就使用了该页面内的组件,内存就会不断增加。
运行环境:
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
cpp
/**
* @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页面还没被渲染,所以内存就会不断增加:
解决:
经过实验,如果在main()中初始化的时候加上setup_scr_home(ui),内存就不会增加了:
**1.**在main() 函数中,加上下图红框里的代码:
**2.**取消勾选 load screen
页面跳转,使用 lv_scr_load(guider_ui.home);
初学LVGL,如有不对,请指正