|
现在项目开发阶段遇到一个LVGL内存溢出的问题。项目没有触屏,用实体按键进行控制,有四个实体按键,分别是确认,上,下,返回,带freertos。
控件只使用了容器,label,btn三种。
芯片:STM32F405RGT6
问题:在进行页面切换的时候,能通过lvgl的监控看到占用内存在一点一点往上加。
做了一些尝试,最后排查问题:
1、分别对页面上的控件进行隔离,再进行页面自动切换(不使用实体按键),排除了容器和label控件的怀疑;
2、创建两个页面分别只保留一个按键,再进行页面自动切换(不使用实体按键),内存不会增加,是正常的;
3、将两个页面上的按键进行keypad,group捆绑,再设置相应的回调函数,使用实体按键进行页面切换,内存会以0.1k每次进行增加;
4、将两个页面上的按键进行keypad,group捆绑,再设置相应的回调函数,进行页面自动切换(不使用实体按键),内存会以0.1k每次进行增加;
以上是遇到的情况。
我的代码部分:
1、输入接口部分,直接读取io口进行获取键值:

2、GUI页面部分,是使用guiguider自动生成后,根据项目做过修改,非常简单,直接创建页面和按钮。
界面1:
[C] 纯文本查看 复制代码 void ui_about_page_init(void)
{
// Write codes screen_info
ui_about_page = lv_obj_create(NULL);
lv_obj_set_size(ui_about_page, 240, 300);
lv_obj_set_scrollbar_mode(ui_about_page, LV_SCROLLBAR_MODE_OFF);
// Write style for screen_info, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT.
lv_obj_set_style_bg_opa(ui_about_page, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(ui_about_page, lv_color_hex(0xffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_grad_dir(ui_about_page, LV_GRAD_DIR_NONE, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_about_return_btn = lv_btn_create(ui_about_page);
ui_about_return_label = lv_label_create(ui_about_return_btn);
lv_label_set_text(ui_about_return_label, "返回");
lv_label_set_long_mode(ui_about_return_label, LV_LABEL_LONG_WRAP);
lv_obj_align(ui_about_return_label, LV_ALIGN_RIGHT_MID, 0, 0);
lv_obj_set_style_pad_all(ui_about_return_btn, 0, LV_STATE_DEFAULT);
lv_obj_set_width(ui_about_return_label, LV_PCT(100));
lv_obj_set_pos(ui_about_return_btn, 170, 290);
lv_obj_set_size(ui_about_return_btn, 70, 30);
// Write style for screen_info_btn_2, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT.
lv_obj_set_style_bg_opa(ui_about_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(ui_about_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_radius(ui_about_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_shadow_width(ui_about_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_color(ui_about_return_btn, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(ui_about_return_btn, &lv_font_OPPOSans_Regular_20, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_opa(ui_about_return_btn, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_align(ui_about_return_btn, LV_TEXT_ALIGN_RIGHT, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_about_key_set();
}
static void ui_event_about_keys_cb(lv_event_t *e)
{
lv_event_code_t event_code = lv_event_get_code(e);
uint32_t *key_id = lv_event_get_param(e);
if (event_code == LV_EVENT_KEY)
{
switch (*key_id)
{
case LV_KEY_ESC:
ui_menu_page_init();
lv_scr_load_anim(ui_menu_page, LV_SCR_LOAD_ANIM_NONE, 100, 0, true);
break;
default:
break;
}
}
}
static void ui_about_key_set(void)
{
extern lv_indev_t *indev_keypad;
lv_group_t *group = lv_group_create();
lv_indev_set_group(indev_keypad, group);
lv_obj_add_event_cb(ui_about_return_btn, ui_event_about_keys_cb, LV_EVENT_ALL, NULL);
lv_group_add_obj(group, ui_about_return_btn);
}
界面2:
[C] 纯文本查看 复制代码 void ui_menu_page_init(void)
{
// Write codes ui_menu_page
ui_menu_page = lv_obj_create(NULL);
lv_obj_set_size(ui_menu_page, 240, 300);
lv_obj_set_scrollbar_mode(ui_menu_page, LV_SCROLLBAR_MODE_OFF);
// Write style for screen_setting, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT.
lv_obj_set_style_bg_opa(ui_menu_page, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(ui_menu_page, lv_color_hex(0xffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_grad_dir(ui_menu_page, LV_GRAD_DIR_NONE, LV_PART_MAIN | LV_STATE_DEFAULT);
// Write codes ui_menu_return_btn
ui_menu_return_btn = lv_btn_create(ui_menu_page);
ui_menu_return_btn_label = lv_label_create(ui_menu_return_btn);
lv_obj_remove_style(ui_menu_return_btn, NULL, LV_STATE_FOCUSED);
lv_label_set_text(ui_menu_return_btn_label, "返回");
lv_label_set_long_mode(ui_menu_return_btn_label, LV_LABEL_LONG_WRAP);
lv_obj_align(ui_menu_return_btn_label, LV_ALIGN_RIGHT_MID, 0, 0);
lv_obj_set_style_pad_all(ui_menu_return_btn, 0, LV_STATE_DEFAULT);
lv_obj_set_width(ui_menu_return_btn_label, LV_PCT(100));
lv_obj_set_pos(ui_menu_return_btn, 170, 50);
lv_obj_set_size(ui_menu_return_btn, 70, 30);
// Write style for ui_menu_return_btn, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT.
lv_obj_set_style_bg_opa(ui_menu_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(ui_menu_return_btn, 255, LV_PART_MAIN | LV_STATE_FOCUSED);
lv_obj_set_style_bg_color(ui_menu_return_btn, lv_color_hex(0x2195f6), LV_PART_MAIN | LV_STATE_FOCUSED);
lv_obj_set_style_border_width(ui_menu_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_radius(ui_menu_return_btn, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_shadow_width(ui_menu_return_btn, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_color(ui_menu_return_btn, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(ui_menu_return_btn, &lv_font_OPPOSans_Regular_20, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_opa(ui_menu_return_btn, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_align(ui_menu_return_btn, LV_TEXT_ALIGN_RIGHT, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_menu_key_set();
}
static void ui_event_menu_list_cb(lv_event_t *e)
{
lv_event_code_t event_code = lv_event_get_code(e);
uint32_t *key_id = lv_event_get_param(e);
if (event_code == LV_EVENT_KEY)
{
lv_obj_t *act_scr = lv_scr_act();
switch (*key_id)
{
case LV_KEY_ENTER:
break;
case LV_KEY_ESC:
ui_about_page_init();
lv_scr_load_anim(ui_about_page, LV_SCR_LOAD_ANIM_NONE, 100, 0, true);
break;
case LV_KEY_PREV:
printf("press up\r\n");
break;
case LV_KEY_NEXT:
printf("press down\r\n");
break;
default:
break;
}
}
}
static void ui_menu_key_set(void)
{
extern lv_indev_t *indev_keypad;
lv_group_t *group = lv_group_create();
lv_indev_set_group(indev_keypad, group);
lv_obj_add_event_cb(ui_menu_return_btn, ui_event_menu_list_cb, LV_EVENT_ALL, NULL);
lv_group_add_obj(group, ui_menu_return_btn);
}
这个是两个界面的代码,通过按键进行页面切屏。
我发现在没捆绑按键回调事件的时候,自动切换页面时,内存是正常的,一捆绑按键事件,按键会有一个聚焦的显示,再进行页面切换就会有内存碎片产生。
这个问题排查了好几天,依旧没有思路,请大伙帮忙看看咋回事。多谢!!!
|
|