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

相关推荐
小镇青年达师傅5 分钟前
System V信号量 vs. POSIX信号量:核心区别与选型指南
linux·嵌入式·多线程·系统编程
cjie2219 分钟前
linux系统调试PCIe板卡常用指令
linux·fpga开发
牛马小陈同学11 分钟前
Kafka+Zookeeper从docker部署到spring boot使用完整教程
linux·spring boot·docker·zookeeper·kafka·prettyzoo·kafka-ui
緣起緣落13 分钟前
Linux(CentOS 7) 部署 redis 集群
linux·运维·服务器·redis·centos·集成学习
蒋星熠1 小时前
在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置
大数据·linux·hadoop·分布式·ubuntu·docker
爱的叹息1 小时前
MongoDB 的详细解析,涵盖其核心概念、架构、功能、操作及应用场景
数据库·mongodb·架构
最后一个bug1 小时前
PCI与PCIe接口的通信架构是主从模式吗?
linux·开发语言·arm开发·stm32·嵌入式硬件
AWS官方合作商2 小时前
实战解析:基于AWS Serverless架构的高并发微服务设计与优化
架构·serverless·aws
李修缘9992 小时前
chown和chmod的区别
linux
白嫖一茶2 小时前
shell语言替换脚本、填补整个命令行
linux·shell