LVGL分析
1 littlevgl線程
littlevgl有幾個線程,作用是什麼?
三個,主線程一個,和在主線程的hal_init函數中創建的另兩個sdl線程。
主線程完成一系列初始化工作後,循環每10ms調用在lv_init函數中註冊的三個任務,indev_proc_task,lv_refr_task,anim_task,重點關注的是每50ms處理一次的輸入處理indev_proc_task和每30ms處理一次的畫面刷新lv_refr_task。
monitor_sdl_refr_thread線程負責輸出圖像和鼠標鍵盤的輸入處理,每次處理後sleep 50ms。
tick_thread線程每5ms增加計時變量一次,用來爲全局提供時間。
2 輸入檢測
輸入檢測到圖像輸出的過程(以單個按鈕被鼠標按下爲例)
- monitor_sdl_refr_thread線程中
鼠標按下,記錄鼠標位置數據
- 主線程中
在indev_proc_task中讀取鼠標位置數據,和控件位置比較,得到控件指針,調用控件signal_func函數,此函數再調用lv_btn_set_state(btn, LV_BTN_STATE_PR)設置按鈕狀態爲按下狀態,此時畫面並沒有實際更新,可以看成是發出了畫面更新請求。
在lv_refr_task中處理收到的畫面更新請求,實際上是修改了畫面變量tft_fb
- monitor_sdl_refr_thread線程中
根據變量tft_fb的值更新畫面
3 畫面刷新
lv_refr_task(30ms調用一次)
lv_refr_areas
lv_refr_area_with_vdb
lv_refr_area_part_vdb
lv_vdb_flush
lv_disp_flush(vdb_act->area.x1, vdb_act->area.y1, vdb_act->area.x2, vdb_act->area.y2, vdb_act->buf);
active->driver.disp_flush(x1, y1, x2, y2, color_p);實現畫面刷新
active->driver.disp_flush:在初始化的時候進行註冊,如下:
lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
/*Set up the functions to access to your display*/
disp_drv.disp_flush = ex_disp_flush;