浅析嵌入式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。它包含一个 HAL(硬件抽象层)接口来注册您的显示和输入设备驱动程序。
LVGL初始化流程
在这里插入图片描述
- 调用
lv_init()
, 初始化LVGL - 实现显示设备驱动的注册
- 实现输入设备驱动的注册
- 实现tick_thread 和 handler_thread
具体参考: https://docs.lvgl.io/master/get-started/quick-overview.html#add-lvgl-into-your-project
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显示性能打下基础。
浅析嵌入式GUI框架-LVGL - 知乎 (zhihu.com)