自学内容网 自学内容网

LVGL 报错记录

前言

由于项目有多个屏幕,guider 生成的代码,会默认给每个屏幕添加一个flag = true,表示当前屏幕未加载,需要进行初始化。

但是我发现,如果发生了屏幕跳转之后,也就是原来的屏幕flag 不设置成 flag = false; 就会触发系统的看门狗复位

代码

/**
 * @brief 从当前屏幕切换到目标屏幕
 * @param source 原屏幕
 * @param target 目标屏幕
*/
void toggle_screen_from_source_to_target(SCREEN_NAME source,SCREEN_NAME target){

if(source == target) return;
sendFlag = false;
lv_obj_t *act_scr = lv_scr_act();
lv_disp_t *d = lv_obj_get_disp(act_scr);
if (d->prev_scr == NULL && (d->scr_to_load == NULL || d->scr_to_load == act_scr))
{

switch (target)
{
case SCREEN_LOGO: 
if(guider_ui.logo_screen_del) setup_scr_logo_screen(&guider_ui);
lv_scr_load_anim(guider_ui.logo_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
case SCREEN_MAIN:
if(guider_ui.main_screen_del)  setup_scr_main_screen(&guider_ui);
lv_scr_load_anim(guider_ui.main_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
case SCREEN_TOPMENUS:
if(guider_ui.topmenus_screen_del)  setup_scr_topmenus_screen(&guider_ui);
lv_scr_load_anim(guider_ui.topmenus_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
case SCREEN_TEMP:   
if(guider_ui.tem_screen_del)  setup_scr_tem_screen(&guider_ui);
lv_scr_load_anim(guider_ui.tem_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
case SCREEN_TIME:   
if(guider_ui.time_screen_del)  setup_scr_time_screen(&guider_ui);
lv_scr_load_anim(guider_ui.time_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
case SCREEN_WORK:   
if(guider_ui.work_screen_del)  setup_scr_work_screen(&guider_ui);
lv_scr_load_anim(guider_ui.work_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
case SCREEN_OVER:
if(guider_ui.over_screen_del)  setup_scr_over_screen(&guider_ui);
lv_scr_load_anim(guider_ui.over_screen, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
break;
default:  break;
}
// 删除旧屏幕
switch (source)
{
case SCREEN_LOGO:      guider_ui.logo_screen_del =true;        break;
case SCREEN_MAIN:      guider_ui.main_screen_del =true;        break;
case SCREEN_TOPMENUS:  guider_ui.topmenus_screen_del =true;    break;
case SCREEN_TEMP:      guider_ui.tem_screen_del  =true;        break;
case SCREEN_TIME:      guider_ui.time_screen_del =true;        break;
case SCREEN_WORK:      guider_ui.work_screen_del =true;        break;
case SCREEN_OVER:      guider_ui.over_screen_del =true;        break;
default:break;
}
}
}

上述代码是会导致看门狗复位的。

报错信息

E (333006) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (333006) task_wdt:  - IDLE0 (CPU 0)
E (333006) task_wdt: Tasks currently running:
E (333006) task_wdt: CPU 0: lv_task_demo
E (333006) task_wdt: CPU 1: IDLE1
E (333006) task_wdt: Print CPU 0 (current core) backtrace


Backtrace: 0x42044EA2:0x3FC977C0 0x40377665:0x3FC977F0 0x42018A87:0x3FCEE0E0 0x42022B28:0x3FCEE150 0x4205AE81:0x3FCEE2C0 0x4201DBDB:0x3FCEE2E0 0x420599E5:0x3FCEE3B0 0x4200F85A:0x3FCEE3D0 0x4200F94F:0x3FCEE3F0 0x420158FD:0x3FCEE430 0x420159B9:0x3FCEE480 0x42015977:0x3FCEE4F0 0x420159B9:0x3FCEE540 0x42015D38:0x3FCEE5B0 0x42015F30:0x3FCEE5E0 0x42016B03:0x3FCEE6C0 0x42016CA2:0x3FCEE750 0x4200EC04:0x3FCEE770 0x4200A9E2:0x3FCEE790 0x4200F8AE:0x3FCEE7C0 0x4200F94F:0x3FCEE7E0 0x4200F2F9:0x3FCEE820 0x4201AD1A:0x3FCEE840 0x4201C2C3:0x3FCEE860 0x42008BC5:0x3FCEE890       
0x42044ea2: task_wdt_timeout_handling at D:/Espressif/frameworks/esp-idf-v5.2.2/components/esp_system/task_wdt/task_wdt.c:441
 (inlined by) task_wdt_isr at D:/Espressif/frameworks/esp-idf-v5.2.2/components/esp_system/task_wdt/task_wdt.c:515
0x40377665: _xt_lowint1 at D:/Espressif/frameworks/esp-idf-v5.2.2/components/xtensa/xtensa_vectors.S:1240
0x42018a87: circ_calc_aa4 at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/draw/lv_draw_mask.c:1370 (discriminator 1)
 (inlined by) lv_draw_mask_radius_init at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/draw/lv_draw_mask.c:529 (discriminator 1)
0x42022b28: lv_draw_sw_arc at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/draw/sw/lv_draw_sw_arc.c:108
0x4205ae81: lv_draw_arc at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/draw/lv_draw_arc.c:51
0x4201dbdb: lv_arc_draw at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/widgets/lv_arc.c:672
 (inlined by) lv_arc_event at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/widgets/lv_arc.c:640
 (inlined by) lv_arc_event at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/widgets/lv_arc.c:414
0x420599e5: lv_obj_event_base at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/core/lv_event.c:96
0x4200f85a: event_send_core at D:/Work/Project/A539/Code/develop/a539_v0_4/managed_components/lvgl__lvgl/src/core/lv_event.c:452

分析

个人初步分析是占用了太多内存,导致堆栈溢出,所以需要进行如下操作:

case SCREEN_LOGO:      guider_ui.logo_screen_del =false;        break;
case SCREEN_MAIN:      guider_ui.main_screen_del =false;        break;
case SCREEN_TOPMENUS:  guider_ui.topmenus_screen_del =false;    break;
case SCREEN_TEMP:      guider_ui.tem_screen_del  =false;        break;
case SCREEN_TIME:      guider_ui.time_screen_del =false;        break;
case SCREEN_WORK:      guider_ui.work_screen_del =false;        break;
case SCREEN_OVER:      guider_ui.over_screen_del =false;        break;
default:break;

原文地址:https://blog.csdn.net/qq_19343801/article/details/142711931

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!