Chip:MIMXRT1176DVMAA
LVGL:8.3.2
OS:FreeRTOS
Hello, due to project requirements, I initially had a test board with MIPI LCD and SDRAM. My program runs on the SDRAM, and all variables are defined in the SDRAM as well. In this case, all the functions of the program work fine. Then, I obtained an final board which had a different MIPI screen. Due to size requirements, it uses HyperRAM instead. The program now runs on NOR Flash, and I defined all the large variables required by LVGL in the HyperRAM. The rest of the program, including lv_conf.h, remains unchanged.
However, in this situation, I encountered some strange issues. On my existing GUI, there are multiple screens. Screen 1 has some labels, and Screen 2 has a list. If I directly open Screen 2, the program always freezes in the lv_task_handler. If I first open Screen 1 and then open Screen 2, Screen 2 can load correctly. However, if I repeatedly load Screen 2 multiple times, the program still freezes. Additionally, I noticed that the display of components like switches and buttons is not normal.
Therefore, I created a separate LVGL project and a simple screen. It contains a button, and I have enabled LV_USE_PERF_MONITOR. The background of the button should be blue, but each time after power-on, it shows one of the following four behaviors.
I found that the code always gets stuck at lv_event_send(obj, LV_EVENT_DRAW_MAIN, draw_ctx), and ultimately, it gets stuck at lv_draw_sw_rect. The call process of lv_draw_sw_rect is as follows:
refr_area
refr_area_part
refr_obj_and_children(draw_ctx, top_act_scr);
refr_obj
refr_obj
lv_event_send(obj, LV_EVENT_DRAW_MAIN, draw_ctx);
event_send_core
event_dsc->cb(e);
base->event_cb(base, e);//lv_obj_event
lv_obj_draw(e);
lv_draw_rect(draw_ctx, &draw_dsc, &coords);
draw_ctx->draw_rect(draw_ctx, dsc, coords);//lv_draw_nxp_rect
#if LV_DRAW_COMPLEX
/* Draw the shadow with CPU */
lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords);//Stuck here!
nxp_dsc.shadow_opa = 0;
#endif /*LV_DRAW_COMPLEX*/
lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords);//Stuck here!
lv_draw_sw_blend(draw_ctx, &blend_dsc)
draw_ctx->wait_for_finish()
vg_lite_finish() //Stuck here
The program stuck in vg_lite_finish() in the function lv_event_send(obj, LV_EVENT_DRAW_MAIN, draw_ctx) rather than every time vg_lite_finish() is called.Then, I tested by disabling LV_DRAW_COMPLEX and performed multiple power-on tests. The display was normal in all cases. However, I need to enable LV_DRAW_COMPLEX to draw these shadows.What could be the possible reasons for this situation?