浅析嵌入式GUI框架-LVGL

LVGL (Light and Versatile Graphics Library) 是最流行的免费开源嵌入式图形库,可为任何 MCU、MPU 和显示类型创建漂亮的 UI

嵌入式GUI框架对比

Features/框架 LVGL Flutter-elinux ArkUI(鸿蒙OS) AWTK QT MIniGUI emWin uC/GUI 柿饼UI
跨平台 鸿蒙OS平台
设备驱动兼容性 多种支持 强大 强大 良好 良好 容易扩展 强大 强大 强大
体积大小 较大 适中 适中 较大
开发环境 C/C++ Dart C/C++ C/C++ C++ C/C++ C/C++ C/C++ C/C++
2D/3D图形 2D 3D渲染引擎 2D/3D 2D和3D 2D和3D 2D 2D 2D 2D
社区支持与文档 良好 非常强大 良好 良好 强大 一般 良好 一般 一般
多媒体支持 部分 部分,可能需额外实现 部分 部分 部分 部分 部分 部分 部分
开发工具链支持 支持 Flutter提供的工具链 支持 支持 支持 支持 支持 支持 支持
应用场景 嵌入式设备、小屏幕设备 设计独立于硬件需求 鸿蒙OS平台相关应用 嵌入式设备、大屏幕设备 多平台多设备应用 嵌入式设备 嵌入式系统等 嵌入式设备 嵌入式设备
许可证/license MIT BSD-style license Apache License 2.0 私有 商业(需要购买)、开源(GPL/LGPL) 私有,部分LGPL 商业(需要购买) 商业(需要购买) 私有
费用/cost 免费 免费(开源) 免费(开源) 收费 社区版免费、商业版收费 部分免费/商业 收费 收费 收费

在嵌入式设备场景,资源比较受限的情况,从渲染性能、许可费用、社区活跃度等做综合对比,LVGL是目前相对较好的选择。

LVGL是如何渲染UI的?

LVGL最低配置要求

  • 16、32 或 64 位微控制器或处理器
  • 建议使用 >16 MHz 时钟速度
  • 闪存/ROM: > 64 kB 用于非常重要的组件 (> 建议使用 180 kB)
  • RAM:
    • 静态 RAM 使用量:~2 kB,取决于使用的功能和对象类型
    • 堆: > 2kB (> 建议使用 8 kB)
    • 动态数据(堆): > 2 KB (> 如果使用多个对象,建议使用 16 kB). 在 lv_conf.h 文件中配置 LV_MEM_SIZE 生效。
    • 显示缓冲区:> “水平分辨率”像素(推荐 >10 × 10ד 水平分辨率”)

  • MCU或外部显示控制器中的一个帧缓冲区
  • C99 或更新的编译器
https://docs.lvgl.io/master/intro/index.html

LVGL 架构

浅析嵌入式GUI框架-LVGL_第1张图片

在这里插入图片描述

应用程序可以与库通信以创建 GUI。它包含一个 HAL(硬件抽象层)接口来注册您的显示和输入设备驱动程序。

LVGL初始化流程

浅析嵌入式GUI框架-LVGL_第2张图片

在这里插入图片描述

  • 调用lv_init(), 初始化LVGL
  • 实现显示设备驱动的注册
  • 实现输入设备驱动的注册
  • 实现tick_thread 和 handler_thread
具体参考: https://docs.lvgl.io/master/get-started/quick-overview.html#add-lvgl-into-your-project

LVGL 渲染链路解析

浅析嵌入式GUI框架-LVGL_第3张图片

在这里插入图片描述

在嵌入式系统中,CPU 是控制整个系统的核心,FrameBuffer 是用于存储屏幕上的图像信息的缓冲区,LCD 屏是用于显示图像的硬件设备。LVGL 库的底层原理是通过 CPU、FrameBuffer 和 LCD 屏之间的协作实现图形界面的显示和交互。

具体来说,当应用程序需要显示图形界面时,LVGL 库会调用底层驱动程序来初始化 FrameBuffer 缓冲区,并将缓冲区中的图像信息传递给 LCD 屏进行显示。此时,CPU 会持续不断地将应用程序中的图形绘制指令传递给 LVGL 库,LVGL 库则将这些指令转换为对 FrameBuffer 缓冲区的操作,并通过底层驱动程序将操作传递给 LCD 屏进行显示。

同时,LVGL 库还会通过底层驱动程序来监测设备上的事件,如按键事件、触摸事件等,并将事件信息传递给 LVGL 库中的事件处理函数进行处理。在事件处理函数中,LVGL 库会根据事件类型和事件发生的位置等信息来进行相应的操作,如改变窗口的位置、更新按钮的状态等。这些操作也是通过对 FrameBuffer 缓冲区的操作来实现的。

此外,LVGL 库中的对象(如窗口、按钮等)需要动态分配内存来存储其属性和状态信息。LVGL 库通过内存池的方式来管理对象的内存分配和释放,提高了内存的使用效率。

CPU、FrameBuffer 和 LCD 屏之间的协作是 LVGL 库实现图形界面的关键。CPU 通过调用 LVGL 库中的函数来操作 FrameBuffer 缓冲区,而 LVGL 库则通过底层驱动程序来将缓冲区中的图像信息传递给 LCD 屏进行显示。

补充知识:Linux FrameBuffer驱动框架

LCD控制链路

浅析嵌入式GUI框架-LVGL_第4张图片

在这里插入图片描述

FrameBuffer驱动框架

浅析嵌入式GUI框架-LVGL_第5张图片

在这里插入图片描述

帧缓冲实际上是内存中的一块物理内存,驱动程序控制显示控制器将这块内存中的数据传输到显示设备上,应用程序只需要向这块内存写入图像数据,显示控制器就会将图像数据传输到显示设备上,完成图像的显示。

总结

LVGL 是目前主流的嵌入式GUI框架,可以通过它很便捷的开发应用层的交互页面,通过深入学习底层原理能够更好的理解LCD屏幕和FrameBuffer和驱动之间的关系,可以为我们后续优化LVGL显示性能打下基础。

浅析嵌入式GUI框架-LVGL - 知乎 (zhihu.com)

你可能感兴趣的:(单片机)