How to safe exit lvgl

Hi @kisvegabor, on my project lvgl has the following functions:

1. Gui window management, buffer size **800X600**
2. Draw the icon or text fill on the camera display, buffer size is **800X50**

Because there is not enough memory on my device, so when switch between function 1 and function 2, I need to exit lvgl each time, and then reinit lvgl with the new buff size.

If LV_ MEM_CUSTOM set 1, how safely release the resource of each lvgl during switching?

I look forward to your reply to the above questions, thank you ver much!

1 Like

I use lv_disp_remove when exit lvgl, the position B’s memory is about 5K bigger then position A.

show mem     //A
use lvgl
exit lvgl
show mem    //B

Sorry, the version of lvgl is V8.3.3.

1 Like

Hi @kisvegabor, do you know how to safety exit lvgl? I’m waiting for you answer, thanks.

Unfortunately we have no good option now to release all resources with MEM_CUSTOM 1. If the built-in memory manager is used we can easily re-init it and you will have a new empty memory.

So I think the simplest would be to use the internal memory manager (MEM_CUSTOM 0). Is it possible?

But do you really need to reinit the whole LVGL? Isn’t deleting all the screens enough?

I’m very glad get your reply.

Yes, I need to release lvgl resource, because the frame size of two mode is diffrent.

1. Gui window management, buffer size **800X600**
2. Draw the icon or text fill on the camera display, buffer size is **800X50**

I will try with LV_MEM_CUSTOM=0 used lv_disp_remove first, thank you very much!

You can also modify the display’s resolution by calling lv_disp_drv_update.

Sorry, I’m late to answer you, because currently I’m busy in project developing.

Is this code corrent? I use " lv_disp_drv_update" like below, it will crash on my board.

void lv_port_disp_reinit(int hor_size, int ver_size)
{
    /* Example for 2) */
    static lv_disp_draw_buf_t draw_buf_dsc_2;
    lv_disp_draw_buf_init(&draw_buf_dsc_2, LCD_FRAMME_BUFF_ADDR_1, LCD_FRAMME_BUFF_ADDR_2, hor_size * ver_size);   /*Initialize the display buffer*/
    
    static lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
    lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/

    /*Set the resolution of the display*/
    disp_drv.hor_res = hor_size ;
    disp_drv.ver_res = ver_size ;

    disp_drv.full_refresh = 0;
    disp_drv.direct_mode = 1;

    /*Used to copy the buffer's content to the display*/
    disp_drv.flush_cb = disp_flush;

    /*Set a display buffer*/
    disp_drv.draw_buf = &draw_buf_dsc_2;

    /*Finally register the driver*/
    lv_disp_drv_update(lv_disp_get_default(), &disp_drv);
}

When close lvgl, this task will not run until reopen(1. lv_port_disp_reinit 2. set g_run_step to GUI_RUNNING):

static void _disp_thread_main( void *arg )
{
    while(1)
    {
        if(GUI_STOP == g_run_step){
            rtos_delay_milliseconds(500);
            continue;
        }
        
        bk_gui_disp_lock();
        lv_task_handler();
        bk_gui_disp_unlock();
        rtos_delay_milliseconds(5);
    }

    rtos_delete_thread(NULL);
}

It looks good at first look. Do you see where it crashes?