浅析嵌入式GUI框架-LVGL

LVGL是什么?

LVGL (Light and Versatile Graphics Library) 是最流行的免费开源嵌入式图形库,可为任何 MCU、MPU 和显示类型创建漂亮的 UI。
在这里插入图片描述
在这里插入图片描述

嵌入式GUI框架对比

Features/框架LVGLFlutter-elinuxArkUI(鸿蒙OS)AWTKQTMIniGUIemWinuC/GUI柿饼UI
跨平台鸿蒙OS平台
设备驱动兼容性多种支持强大强大良好良好容易扩展强大强大强大
体积大小较大适中适中较大
开发环境C/C++DartC/C++C/C++C++C/C++C/C++C/C++C/C++
2D/3D图形2D3D渲染引擎2D/3D2D和3D2D和3D2D2D2D2D
社区支持与文档良好非常强大良好良好强大一般良好一般一般
多媒体支持部分部分,可能需额外实现部分部分部分部分部分部分部分
开发工具链支持支持Flutter提供的工具链支持支持支持支持支持支持支持
应用场景嵌入式设备、小屏幕设备设计独立于硬件需求鸿蒙OS平台相关应用嵌入式设备、大屏幕设备多平台多设备应用嵌入式设备嵌入式系统等嵌入式设备嵌入式设备
许可证/licenseMITBSD-style licenseApache 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显示性能打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/48661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker安装MySQL集群(一主一从)

目录 docker安装MySQL集群(一主一从)前菜测试MySQL 集群安装master容器slave容器master容器配置主从赋值测试 docker安装MySQL集群(一主一从) 前菜测试 1、拉取mysql5.7的镜像到本地 [rootaliyun ~]# docker pull mysql:5.72、…

idea 关闭页面右侧预览框/预览条

idea 关闭页面右侧预览框 如图,预览框存在想去除 找了好多方法,什么去掉“setting->appearance里的show editor preview tooltips”的对钩;又或者在该预览区的滚动条上右键,“取消勾选show code lens on scrollbar hover”。都…

ICASSP 2023 | MCROOD: MULTI-CLASS RADAR OUT-OF-DISTRIBUTION DETECTION

原文链接:https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486484&idx1&snd43f92ca0230753e77f54557054653d6&chksmcf51beedf82637fb27d4cbb9279f273298779dabe25f7775cb93469787bcc12c1b6b2caec979#rd ICASSP 2023 | MCROOD: MULTI-CLASS…

QUiLoader:彻底分离你的Ui设计工作

QUiLoader:彻底分离你的Ui设计工作 1. QUiLoader:彻底分离你的Ui设计工作widget.hwidget.cpp 2. Qt、C动态UI3. QT 使用QLibrary加载动态库 1. QUiLoader:彻底分离你的Ui设计工作 原文链接:https://blog.csdn.net/adonis1620/article/details/5794797 Trolltech提…

新一代网络安全防护体系的五个关键特征

目前,网络安全技术正面临着一个转折点,基于边界的安全防护理论存在缺陷,基于规则的威胁判别机制不再有效,围绕传统技术构建的安全工程也不再适用。新一代安全建设不能再像修“城墙”一样,专注于外部网络攻击和已知威胁…

测试常见前端bug

目录 协作 测试方法 标签:标签 内容/ref/ 判断 arr&&arr.length 交互 样式不生效:devtools查找,编译前的标签,运行时不一定存在 可交互的需要提示 hover样式 没有交互逻辑,就不要设置交互 无法交互…

《MySQL》第十一篇 SQL_MODEL模式简述

目录 一. 介绍与使用二. 模式类型三. 常用模式演示ANSI 模式TRADITIONAL 模式STRICT_TRANS_TABLES 模式 一. 介绍与使用 SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL 常用来解决下面几类问题: 通过设置S…

Opencv Win10+Qt+Cmake 开发环境搭建

文章目录 一.Opencv安装二.Qt搭建opencv开发环境 一.Opencv安装 官网下载Opencv安装包 双击下载的软件进行解压 3. 系统环境变量添加 二.Qt搭建opencv开发环境 创建一个新的Qt项目(Non-Qt Project) 打开创建好的项目中的CMakeLists.txt,添加如下代码 # openc…

【实践篇】推荐算法PaaS化探索与实践 | 京东云技术团队

作者:京东零售 崔宁 1. 背景说明 目前,推荐算法部支持了主站、企业业务、全渠道等20业务线的900推荐场景,通过梳理大促运营、各垂直业务线推荐场景的共性需求,对现有推荐算法能力进行沉淀和积累,并通过算法PaaS化打造…

【数据结构】--189.轮转数组

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

【LLM】浅析chatglm的sft+p-tuning v2

note GLM将针对不同类型下游任务的预训练目标统一为了自回归填空,结合了混合的注意力机制和新的二维位置编码。本文浅析sft,并基于GLM在广告描述数据集上进行sftp-tuning代码的数据流讲解 文章目录 note零、ChatGLM2模型一、Supervised fine-tuning1. 数…

如何解决使用Elsivier默认latex模板,显示多位作者名字而不是et.al形式

问题描述: 使用Elsivier默认模板,编辑论文的时候,使用\citep{论文缩写}命令,发现在编译之后的.pdf文件中,会显示出该论文所有作者的姓(红色部分),而不是使用et.al的形式(绿色部分&a…

【Python】在PyCharm中安装 ChatGPT 插件,让 AI 帮助我们写代码,从此代码再无报错,小白也能轻易上手!!!

前言 ChatGPT是目前最强大的AI,不仅能够聊天、写小说,甚至码代码也不在话下。 但是在国内要使用chatgpt很麻烦,国内一家团队开发了一款idea插件NexChatGPT,用数据代理的方式,让我们在国内也能轻松的使用chatgpt。 没…

ENVI提取NDVI与植被覆盖度估算

目标是通过ENVI计算植被覆盖度结合ArcGIS出图得到植被覆盖图。 一、植被覆盖度的定义: 植被覆盖度( FractionalVegetation Cover,FVC) 通常定义为植被( 包括叶、茎、枝) 在地面的垂直投影面积占统计区总面积的百分比,它量化了植被的茂密程度,反应了植被的生长态势,是刻画…

Java8 LocalDate、Date、LocalDateTime、时间戳的转换

文章目录 LocalDateplusminus比较日期 LocalDate、Date、LocalDateTime、时间戳的转换 LocalDate plus LocalDate localDate2 localDate1.plus(15, ChronoUnit.DAYS);LocalDate localDate2 localDate1.plus(Period.ofDays(15));minus LocalDate localDate2 localDate1.minu…

制作一个简易的计算器app

github项目地址:https://github.com/13008451162/AndroidMoblieCalculator 1、Ui开发 笔者的Ui制作的制作的比较麻烦仅供参考,在这里使用了多个LinearLayout对屏幕进行了划分。不建议大家这样做最好使用GridLayout会更加快捷简单 笔者大致划分是这样的…

vue 学习笔记 【ElementPlus】el-menu 折叠后图标不见了

项目当前版本 {"dependencies": {"element-plus/icons-vue": "^2.1.0","types/js-cookie": "^3.0.3","types/nprogress": "^0.2.0","axios": "^1.4.0","core-js": &quo…

Java - 注解开发

注解开发定义bean Component的衍生注解 Service: 服务层的注解 Repository: 数据层的注解 Controller: 控制层的注解 纯注解开发 bean管理 bean作用范围 在类上面添加Scope(“singleton”) // prototype: 非单例 bean生命周期 PostCon…

推荐用于学习RN原生模块开发的开源库—react-native-ble-manager

如题RN的原生模块/Native Modules的开发是一项很重要的技能,但RN官网的示例又比较简单,然后最近我接触与使用、还有阅读了react-native-ble-manager的部份源码,发现里边完全包含了一个Native Modules所涉及的知识点/技术点,故特推…

java商城系统和php商城系统对比

java商城系统和php商城系统是两种常见的电子商务平台,它们都具有一定的优势和劣势。那么,java商城系统和php商城系统又有哪些差异呢? 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…