OneOS基于 LVGL 移植轻量化图形组件

随着触摸屏和物联网技术的发展,各类电子产品呈现两个趋势:一是各类智能硬件从无屏到有屏,从黑 白屏到高清彩屏,带电子屏的产品数量激增;二是人机界面更加酷炫流畅,交互功能趋向智能化。图形 用户界面( GUI )快速推进了嵌入式产品的智能化,大幅提升了用户体验,降低了用户使用门槛,普惠 更广泛的社会人群。

轻量化图形组件可以依托于 OneOS ,在各种各样带屏幕的 MCU 产品上大放光彩。比如:智能家居、工业 控制、汽车表盘、医疗设备、穿戴设备等,可谓是大有可为!如果说 MCU 上的 CPU 核是灵魂,那么屏幕 则是它美丽的容颜,让人一眼难忘。

1 组件信息

本轻量化图形组件基于 LVGL 移植,目前支持版本: LVGL7.9 及 LVGL8.2 。支持之初,我们考量了市面上常用的开源图形框架,最终在 QT for MCU , LVGL ,以及 GUIX 三者中选择了 LVGL ,也和其 LVGL 开源项目的发起者 Kiss-Vámosi 建立了友好的合作。而后,我们增加了 Arm-2D 用以支撑硬件加速,以及更小资源的图形显示。

目前为止,本轻量化图形界面 GUI 组件达到如下的设计目标及功能:

  1.  强大的构建块,例如按钮、图表、列表、滑块、图像等
  2. 带有动画、抗锯齿、不透明度、平滑滚动的高级图形
  3. 支持各种输入设备,如触摸板、鼠标、键盘、编码器等
  4. 具有类似 CSS 样式的完全可定制的图形元素
  5. 独立于硬件:与任何微控制器或显示器一起使用
  6. 即具有高级图形效果,也可进行单帧缓冲区操作
  7. 用 C 编写以获得最大的兼容性(C++ 兼容)
  8. 多语言支持 UTF-8 编码
  9. 多显示器支持,即同时使用多个 TFT、单色显示器
  10. 可扩展:能够以很少的内存运行(64 kB Flash,16 kB RAM)
  11. 高性能:在 Cortex-M4 架构 MCU 芯片,GUI 渲染帧率达到 40FPS 

2 开始体验

体验的第一步就是高效使用 menuconfig 对轻量级框架进行快速使用和配置。该章节对配置进行了较为详细的阐明。

(Top) → Components→ GUI 
(lcd) GUI display dev name 
(touch) GUI input dev name 
[*] Enable LVGL --->

touch 和 lcd 是 GUI 的输入输出设备,选中 Enable LVGL 即可使能 LVGL ,目前支持的版本为 LVGL7.9 和 LVGL8.2 。

LVGL (Enable lvgl 8.2) --->
LVGL basic menu --->
Widget usage ---> 
Extra Widgets ---> 
Themes ---> 
Layouts ---> 
Text Settings ---> 
Font usage ---> 
LVGL FileSystem ---> 
LVGL Log ---> 
LVGL Asserts ---> 
Third party Lib ---> 
Extra ---> 
[ ] Enable LVGL examples ---- 
[*] Enable LVGL Demo --->

以上是适配支持的 LVGL 主要 menuconfig 配置。从上到下一一解释。

  1. LVGL basic menu 是 LVGL 最基本的配置,也是最重要的配置
  2. Widget usage 是对基础控件的支持与使能
  3. Extra Widgets 是对额外的高级控件的支持与使能
  4. Themes 是自带的一些主题
  5. Layouts 布局
  6. Text Settings 文本编码设置
  7. Font usage 字体选择
  8. LVGL FileSystem 文件系统支持
  9. LVGL Log 信息打印辅助开发
  10. LVGL Asserts 断言
  11. Third party Lib 第三方库
  12. Extra 其它功能
  13. Enable LVGL examples 一些简单的示例
  14. Enable LVGL Demo 一些复杂的示例

LVGL basic menu

(120) LVGL buff lines 
(20) LVGL display refresh period(ms) 
(30) Input device read period(ms) 
(10) GUI task priority 
(4096) GUI task stack size 
(5) GUI task msleep 
[ ] Enable LVGL two buff 
[ ] Enable CPU usage and FPS count Show 
[ ] Show the used memory and the memory fragmentation 
[ ] LVGL minimal configuration. 
[*] Enable graphics acceleration 
[*] Enable complex draw engine 
  1. LVGL 的单绘制缓冲区的行数
  2. 默认显示刷新周期, LVGL 将在此期间重新绘制更改的区域
  3. 输入设备读取周期
  4. GUI 任务的优先级设置
  5. GUI 任务的栈大小设置
  6. GUI 任务的默认睡眠时间
  7. 使能 LVGL 双绘制缓冲区
  8. 显示 CPU 使用率和 FPS 计数显示
  9. 显示已用内存和内存碎片
  10. LVGL 最小化配置,一般用于硬件资源很小的情况
  11. 使能硬件加速
  12. 使能复杂绘图引擎

3 提高帧率 

帧率 FPS 是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS 是 测量用于保存、显示动态视频的信息数量。每秒钟帧数越多,所显示的动作就会越流畅。通常,要避免动作不流畅的最低是 10。对于帧率,我们主要关注以下几个方面:

  1. 硬件本身性能
  2. OneOS-Lite 系统影响
  3. LVGL 本身

通常,要使得 FPS 更高,硬件选型是第一步

  1. 内核,处理能力越强,对 FPS 会有提升。
  2. 内存,尽量选择 SRAM,对 FPS 提升很大,SDRAM 相比于 SRAM 逊色不少。
  3. 传输方式 SPI/LCD/DSI,使用 SPI 传输缓存数据至屏幕,显然不如 LCD 或者 DSI。
  4. 具有专门处理图形图像的硬件,比如 stm32 的 DMA2D。
  5. 更小的屏幕(分辨率)。

OneOS-Lite 系统影响

LVGL 本身是运行在 OneOS 之上的,因此,OneOS 的配置会对帧率产生影响。硬件的支持也需要系统的管理。

  1. tick frequecy 设置低一些,可能会提高帧率。想一想也是哈,tick frequecy 影响的是时钟中断。设置低一些,时钟中断会来得没有那么频繁。
  2. 尽量使用 SRAM。即使同样是 SRAM,使用全局变量会比使用 malloc 分配,获得更高的帧率。想一 想也是哈,内存管理需要消耗时间。
  3. OneOS-Lite 支持 LTDC,DSI,DMA2D 等。
  4. 不要让 lvgl 优先级太低,如果更高优先级的任务频繁执行,会影响图形显示性能。
  5. 尽量让存储帧缓冲器的存储器仅用于帧缓冲,如果用于存储帧缓冲器的存储器还用于其他应用,那可能会影响系统的图形性能。
  6. 使用更高的优化级别,能提高帧率。

VGL 本身的配置也是影响其性能

  1. 不要打开性能监控 LV_USE_PERF_MONITOR && LV_USE_MEM_MONITOR
  2. 如果支持,建议开启相关硬件加速,比如: LV_USE_GPU_STM32_DMA2D
  3. 建议帧缓存区不要低于屏幕的 1/4,建议双缓存

4 运行 Demo

Benchmark 是 LVGL 性能测试的测试用例。其在矩形、边框、阴影、文本、图像混合、图像变换、混合模式等各种情况下进行性能测试。测试期间对象的大小和位置使用伪随机数设置,以使得性能测试可重复。我们现在来运行它!

使用 menuconfifig 配置 Benchmark 性能测试用例,并使用 keil 或者 gcc 编译,并烧写程序到 stm32f469-st-disco 板子上去。

重启开发板,此时,性能测试将会运行,屏幕顶部显示当前测试步骤的标题和上一步骤的结果。

FPS 的代码测量原理如下:

  1. 构造 scene_dsc_t 结构体,并在其中保存各种场景下的帧率测试所需数据,包含:场景名、用于场景测试的回调函数、消耗渲染时间、刷新次数,以及权重。其中测试场景 48 个,叠加显示不透明度与完全不透明度方式,则测试总场景 96 个。
  2. 在显示驱动的回调函数 monitor_cb 中,实现每一个测试场景的累积渲染时间和帧数。获取到此数据后,便可得到每秒钟帧数,即 FPS= 帧数 / 累积渲染时间。
  3. 在 lv_demo_benchmark 帧率测试入口函数中,调用 scene_next_task_cb 函数,并在其中调用每一个 scene_dsc_t 结构体中的场景测试回调函数,对每一个场景进行测试。
  4. 测试完每一个场景,即可得到每一个场景对应的帧率 FPS,通过加权平均的方式,获取到平均帧率。

测试原理逻辑图如下:

5 未来与期待

 最后,轻量化图形组件仍然在持续地迭代开发中,并计划加入更多的功能,目前已计划的有:

  • 增加高级语言 JS 的支持增加高级语言 MicroPython 的支持
  • 增加字体转换库
  • 增加图片转换库

一起走过的路,回首看,定满是繁花 🌷 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在移植 Linux WiFi 代码到 OneOS 上,需要遵循以下步骤: 1. 收集所需的工具: 一台运行 Linux 的 PC 以及针对 OneOS 的交叉编译器 2. 收集需要移植的 WiFi 驱动源代码 3. 在 PC 上编译 WiFi 驱动并在运行正常的 Linux 系统上进行测试 4. 使用交叉编译器将 WiFi 驱动编译成 OneOS 的可执行代码 5. 将编译出的可执行代码上传到 OneOS 系统中 6. 在 OneOS 上运行 WiFi 驱动并测试其功能是否正常 这些步骤中的具体细节可能会因为不同的 WiFi 驱动或 OneOS 版本而有所不同, 请仔细阅读相关文档。 注意:由于移植的难度程度和系统的差异,移植 Linux WiFi 代码到 OneOS 上可能需要一定的 Linux 驱动开发经验和熟悉 OneOS 的知识。 ### 回答2: 将Linux的WiFi代码移植OneOS上需要以下步骤: 1. 确定OneOS的硬件支持:首先,需要确定OneOS支持的硬件平台是否与Linux的WiFi模块兼容。查看OneOS的支持列表或者相关文档,确认所使用的硬件平台是否支持WiFi功能。 2. 确定WiFi模块的适配层:OneOS与Linux的内核不同,所以需要适配WiFi模块的代码和驱动程序。可以根据硬件平台的特性,选择合适的适配层,将WiFi模块的驱动程序和相关代码嵌入到OneOS的内核中。 3. 调整硬件接口和功能:OneOS的API和Linux的API可能存在差异,所以在移植过程中需要调整硬件接口和功能的相应代码。这包括初始化、配置和操作WiFi模块等。 4. 进行编译和调试:移植完WiFi代码后,进行编译和调试,确保代码的正确性和稳定性。使用OneOS提供的工具链进行编译,并在实际硬件平台上进行测试和调试。 5. 验证和优化:完成编译和调试后,需要验证WiFi模块的功能是否正常。进行功能测试,确保WiFi的连接和传输正常。如果遇到问题,可以进行优化和调整,以满足OneOS的要求和性能。 在移植过程中需要注意OneOS的内核架构和功能特性,与Linux有所不同。因此,需要仔细了解OneOS的文档和代码,确保正确移植WiFi功能。 ### 回答3: 将Linux的WiFi代码移植OneOS上,需要经过一系列的步骤和适应性调整。 首先,需要将Linux的WiFi驱动代码从Linux内核源码中提取出来。可以通过查看Linux内核源码中的wifi驱动目录,将相关文件复制到OneOS的代码工程中。 然后,需要根据OneOS的内核结构和设备驱动框架,对从Linux中提取出来的WiFi驱动代码进行适当的修改和调整。在此过程中,可能需要根据OneOS的API和设备管理机制进行适配,以兼容OneOS的驱动架构和网络栈。 接下来,要根据OneOS的文件系统、内存管理和网络协议栈等子系统,对WiFi驱动进行相应的配置和参数设置。这包括将WiFi驱动与OneOS的网络协议栈集成,确保其与OneOS的网络接口、网络协议栈以及网络协议栈的配置相匹配。 然后,需要针对OneOS的硬件抽象层(HAL)进行适配。这可能涉及到对硬件抽象层代码的修改,以使WiFi驱动能够正确地与OneOS的硬件平台进行通信和交互。 最后,还需要进行一系列的编译、链接和调试工作,确保WiFi驱动在OneOS上能够正确地运行和提供相应的网络功能。 综上所述,将Linux的WiFi代码移植OneOS上需要从Linux内核中提取并适应代码、对接OneOS的驱动架构和网络栈、与硬件抽象层进行适配,最终完成编译和调试工作。这个过程需要开发者对Linux和OneOS的内核、驱动架构和网络协议栈有一定的了解和经验,以确保驱动的正确性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自橙一派

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值