LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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 算法的一些关键特点:

  1. 两级隔离:内存被分为两个层次,大内存块和小内存块,以减少内存碎片。

  2. 快速分配:通过快速搜索空闲列表,TLSF 能够迅速找到合适大小的内存块。

  3. 合并策略:当内存块被释放时,TLSF 会尝试与相邻的空闲块合并,以减少内存碎片。

  4. 可配置性:TLSF 允许开发者根据系统的具体需求配置内存块的大小和数量。

  5. 低开销:与其他内存管理算法相比,TLSF 具有较低的运行时开销。

  6. 适用性:适用于需要频繁内存分配和释放的场景,尤其是在资源受限的系统中。

在 LVGL 或其他嵌入式图形库中,有效的内存管理对于确保 GUI 运行流畅和响应迅速至关重要。如果 LVGL 使用了类似 TLSF 的内存管理技术,它将帮助库在有限的内存资源下高效地处理 GUI 组件和渲染任务。

posted on 2024-06-24 23:59  ArnoldLu  阅读(653)  评论(0编辑  收藏  举报

导航