浅析嵌入式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显示性能打下基础。

相关推荐
熊出没8 小时前
云原生架构落地实践:Kubernetes 生产级配置与 Service Mesh 流量治理
云原生·架构·kubernetes·istio
小坏讲微服务8 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
不昀8 小时前
网口Link Up后仍然掉线,怎样区分物理链路和数据通路问题?
linux·以太网
迪康妍妍8 小时前
终端管控实操:封堵网盘与IM外发通道的落地思路
运维·网络·安全·架构·安全性测试
Lhan.zzZ9 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
Fcy64810 小时前
Linux下 多路转接select详解
linux·select·多路转接
无足鸟ICT11 小时前
【RHCA+】RPM包命名规则
linux·运维·服务器
Zucker n11 小时前
一款适合研究生科研工作安排的日历
linux·数据库·python
光影少年11 小时前
AI Agent、自动化与未来工作
人工智能·算法·架构
爱吃香菜的初学者11 小时前
十六.Linux——多线程(2)
linux·运维·开发语言