利用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系统初始化完成后,准备载入屏幕控件以前调只用一次即可,只调用一次,只调用一次。(重要的事情复读机)