浅析嵌入式GUI框架-LVGL

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 或更新的编译器

docs.lvgl.io/master/intr...

LVGL 架构

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

LVGL初始化流程

  • 调用lv_init(), 初始化LVGL
  • 实现显示设备驱动的注册
  • 实现输入设备驱动的注册
  • 实现tick_thread 和 handler_thread

具体参考:docs.lvgl.io/master/get-...

LVGL 渲染链路解析

在嵌入式系统中,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控制链路

FrameBuffer驱动框架

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

总结

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

相关推荐
Jason_zhao_MR19 小时前
米尔RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构
linux·嵌入式硬件·物联网·架构·嵌入式·嵌入式实时数据库
叮咚侠19 小时前
Ubuntu 24.04.3 LTS 中 vdb 的 UUID 永久挂载没有显示的磁盘的操作步骤
linux·运维·ubuntu·挂载磁盘
シ風箏19 小时前
Flink【基础知识 01】简介+核心架构+分层API+集群架构+应用场景+特点优势(一篇即可大概了解Flink)
大数据·架构·flink·bigdata
.小墨迹19 小时前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
风华同学19 小时前
【Linux驱动篇】LED驱动开发实验
linux·驱动开发·ubuntu
李斯维19 小时前
安装 WSL 最好的方式
linux·windows
Psycho_MrZhang19 小时前
Airflow简介和架构
架构·wpf
张小九9920 小时前
fpocket安装和使用教程
linux·机器学习·github
IT知识分享20 小时前
中科天玑全要素AI舆情系统功能、架构解析
人工智能·语言模型·架构
元气满满-樱20 小时前
Rewrite重写
linux·nginx