LVGL分析-畫面刷新

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;     

參考

littlevgl架構淺析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章