LVGL(2):Ubuntu下基于VSCoce搭建LVGL开发环境和启动流程
在PC上可以调试LVGL(参考Simulator on PC — LVGL documentation),借助VSCode在Ubuntu下调试可以参考:GitHub - lvgl/lv_port_pc_vscode。
1 下载VSCode项目代码
git clone --recursive https://github.com/lvgl/lv_port_pc_vscode
2 安装SDL以及相关库和工具
sudo apt-get update && sudo apt-get install -y build-essential libsdl2-dev cmake
3 安装VSCode并运行调试LVGL
下载VSCode《Download Visual Studio Code - Mac, Linux, Windows》,运行VSCode,根据建议安装插件。
打开项目:File->Open workspace from File...。
在TERMINAL窗口,编译工程:
mkdir build
cd build
cmake ..
make -j
运行(F5)或调试运行(Ctrl+F5):
4 LVGL主要流程分析
更多参考《Welcome to the documentation of LVGL! — LVGL documentation》,或者PDF《LVGL pdf》
一个LVGL应用主要流程包括:
- 调用lv_init()初始化LVGL主要组件。
- 初始化显示设备,比如Framebuffer、DRM、SDL等。
- 分配显存,并注册显示相关timer、组件等。周期性更新显示缓存。
- input设备初始化。
- 初始化input设备驱动,注册input设备。周期性获取input设备数据,根据input设备执行UI更新。
- 周期性处理LVGL任务。
main
->lv_init--初始化LVGL库,创建基础组件。
lv_mem_init
lv_tlsf_create_with_pool--基于TLSF创建内存分配池。
_lv_timer_core_init--创建timer链表。
_lv_fs_init--创建fs链表。
_lv_anim_core_init--创建动画相关timer。
lv_timer_create
anim_timer
_lv_group_init--创建group列表。
lv_draw_init
_lv_obj_style_init
_lv_img_decoder_init
lv_img_decoder_create--创建一个图像解码器,其主要由4个回调函数组成。
lv_img_decoder_built_in_info
lv_img_decoder_built_in_open
lv_img_decoder_built_in_read_line
lv_img_decoder_built_in_close
lv_extra_init
lv_flex_init
lv_grid_init
->fbdev_init--打开FBDEV_PATH设备,获取FBIOGET_FSCREENINFO/FBIOGET_VSCREENINFO信息,进行内存mmap映射。
->lv_disp_draw_buf_init--初始化一个lv_disp_draw_buf_t。
->lv_disp_drv_register--
lv_timer_create--每隔LV_DISP_DEF_REFR_PERIOD毫秒,刷新一次。
_lv_disp_refr_timer
lv_obj_create
lv_obj_remove_style_all
lv_obj_clear_flag
lv_obj_invalidate
lv_timer_ready
->evdev_init--打开EVDEV_NAME设备,句柄为evdev_fd。
->lv_indev_drv_init--初始化输入设备驱动。
->lv_indev_drv_register--注册输入设备驱动。
lv_timer_create
lv_indev_read_timer_cb--每LV_INDEV_DEF_READ_PERIOD毫秒读一次input设备。
_lv_indev_read--读取input设备的数据。
evdev_read--读取evdev_fd句柄的值,处理不同类型输入设备。
indev_pointer_proc--LV_INDEV_TYPE_POINTER类型input设备处理。
lv_obj_set_pos--更新鼠标指针位置。
indev_proc_press--按键按下行为。
indev_proc_release--按键释放行为。
->lv_timer_handler--周期性处理LVGL任务。
其中TLSF(Two-Level Segregation Fit) 是一种快速且高效的内存分配算法,它通过将内存分割成不同的大小类别来优化内存的使用。这种算法通常用于嵌入式系统,因为它可以在有限的内存资源下提供良好的性能。以下是 TLSF 算法的一些关键特点:
-
两级隔离:内存被分为两个层次,大内存块和小内存块,以减少内存碎片。
-
快速分配:通过快速搜索空闲列表,TLSF 能够迅速找到合适大小的内存块。
-
合并策略:当内存块被释放时,TLSF 会尝试与相邻的空闲块合并,以减少内存碎片。
-
可配置性:TLSF 允许开发者根据系统的具体需求配置内存块的大小和数量。
-
低开销:与其他内存管理算法相比,TLSF 具有较低的运行时开销。
-
适用性:适用于需要频繁内存分配和释放的场景,尤其是在资源受限的系统中。
在 LVGL 或其他嵌入式图形库中,有效的内存管理对于确保 GUI 运行流畅和响应迅速至关重要。如果 LVGL 使用了类似 TLSF 的内存管理技术,它将帮助库在有限的内存资源下高效地处理 GUI 组件和渲染任务。