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

相关推荐
007php0074 小时前
linux服务器上CentOS的yum和Ubuntu包管理工具apt区别与使用实战
linux·运维·服务器·ubuntu·centos·php·ai编程
djykkkkkk4 小时前
ubuntu编译遇到的问题
linux·运维·ubuntu
qq_429856574 小时前
linux 查看服务是否开机自启动
linux·运维·服务器
7yewh5 小时前
Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
linux·arm开发·驱动开发·嵌入式硬件·嵌入式
dessler6 小时前
Docker-Dockerfile讲解(三)
linux·运维·docker
KevinRay_6 小时前
命令行之巅:Linux Shell编程的至高艺术(中)
linux·运维·服务器·重定向·shell编程
程序员JerrySUN6 小时前
Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制
linux·嵌入式硬件·物联网·缓存·系统架构
2401_857610037 小时前
中文学习系统:成本效益分析与系统优化
java·数据库·学习·架构
林农8 小时前
C05S16-MySQL高可用
linux·mysql·云计算
码中小白鼠8 小时前
Ubuntu系统部署Mysql8.0后设置不区分大小写
linux·mysql·ubuntu·adb