目录
一、GUI简介
1、emWin
2、LVGL (Light and Versatile Graphics Library)
3、TouchGFX
4、Qt for Embedded
5、特性对比总结
二、LVGL移植要求
三、优化LVGL运行效果方法
四、LVGL系统文件
一、GUI简介
在嵌入式系统中,emWin、LVGL、TouchGFX 和 Qt 是四种常见的图形用户界面(GUI)框架。它们各自具有不同的特性和优势,适用于不同类型的嵌入式开发需求。以下是这四种框架的详细比较,涵盖它们的特性、优缺点以及应用场景。
1、emWin
-
特性:
- 图形用户界面(GUI):emWin 是一个高效、功能强大的图形库,专为嵌入式应用设计,广泛用于高性能嵌入式显示器中。
- 任务特性:emWin 本身不具备任务调度的功能,它只是一个图形库,通常需要与实时操作系统(RTOS)结合使用。可以在多任务环境中运行,配合 RTOS 进行任务调度。
- 内存管理:emWin 允许开发者根据系统需求来调整内存分配,包括屏幕缓存、字体和资源。内存的使用可以进行配置,以适应不同的嵌入式设备。
- 字符与字体:支持多种字体,用户可以选择内置字体或自定义字体,字符集支持广泛,可以根据需要选择存储方式(如动态或静态)。
- 性能:在性能方面,emWin 可以针对硬件优化,支持硬件加速(如 GPU 渲染)。
-
适用场景:
- 适用于需要较高性能、丰富 GUI 功能且硬件资源有限的嵌入式设备,尤其是在需要精细控制内存的场景中,如医疗、工业和消费类电子产品。
2、LVGL (Light and Versatile Graphics Library)
-
特性:
- 图形用户界面(GUI):LVGL 是一个开源的图形库,设计上轻量、灵活、适用于各种嵌入式设备,尤其是资源有限的设备。支持触摸屏、按钮、滑块、图形、动画等 GUI 控件。
- 任务特性:LVGL 本身没有内置任务调度系统,但可以与 RTOS 或单任务系统集成。在使用 RTOS 时,LVGL 可以运行在一个任务中,通过实时调度和事件驱动来进行界面更新。
- 内存管理:LVGL 支持内存配置,可以根据需要选择不同的内存管理方式,适应不同的嵌入式系统。开发者可以控制内存池的大小、使用方式等。
- 字符与字体:支持自定义字体,字符集支持较广,可以选择字体大小、字形以及是否启用抗锯齿等。
-
适用场景:
- 适用于低功耗、资源有限的嵌入式设备,特别是对于有触摸屏需求的系统(如智能家居、汽车仪表盘、便携设备等)。
3、TouchGFX
-
特性:
- 图形用户界面(GUI):TouchGFX 是一个专为嵌入式系统设计的高性能图形框架,支持丰富的图形界面元素,如图标、按钮、滑块、动画等。
- 任务特性:TouchGFX 支持与 RTOS 集成,通过任务调度器进行任务分配。TouchGFX 可以在 RTOS 上的任务中运行,并通过事件驱动来更新显示内容。
- 内存管理:TouchGFX 提供灵活的内存管理方式,可以根据应用需求调整内存池的大小。它支持图形硬件加速(如 GPU 和 DMA2D),使得图形渲染更加高效。
- 字符与字体:支持自定义字体,内置了多种字符集和字体格式,且提供了图形界面元素的个性化定制。
-
适用场景:
- 适用于中高端嵌入式显示应用,特别是要求高性能和精美动画效果的设备,如智能仪表、嵌入式消费电子产品、汽车显示屏等。
4、Qt for Embedded
-
特性:
- 图形用户界面(GUI):Qt 是一个功能非常强大的跨平台 GUI 框架,Qt for Embedded 版本专为嵌入式系统设计,支持全面的 GUI 功能,如窗口管理、复杂的控件、动画等。
- 任务特性:Qt 是一个完整的应用程序框架,内建有事件循环和任务调度系统,可以在多任务环境下运行。因此,它可以直接处理任务调度,不需要依赖外部的 RTOS,尽管它也可以与 RTOS 配合使用。
- 内存管理:Qt for Embedded 相对较重,对于资源有限的嵌入式设备,可能会面临内存占用较高的问题。它需要较大的内存空间(通常为几 MB 到几十 MB)。
- 字符与字体:支持多种字体格式,并且可以通过 Qt Creator 自定义和优化字体和字符集。Qt 提供的字体库非常丰富,可以通过字体渲染引擎来优化显示效果。
-
适用场景:
- 适用于需要丰富 GUI 功能、复杂交互、以及较高性能要求的嵌入式系统,尤其是在大屏幕显示、用户界面复杂、需要丰富视觉效果的应用中,如智能家居、工业控制、医疗设备等。
5、特性对比总结
特性/框架 | emWin | LVGL | TouchGFX | Qt for Embedded |
---|---|---|---|---|
图形界面(GUI) | 强大,支持各种控件和图形元素 | 轻量,支持基础控件和动画 | 强大,支持复杂图形和动画 | 全功能,支持复杂控件和动画 |
任务调度 | 无内建任务调度,需与 RTOS 配合 | 无内建任务调度,需与 RTOS 配合 | 支持 RTOS,内建任务调度 | 自带任务调度系统 |
内存管理 | 可配置内存使用,支持硬件加速 | 内存配置灵活,适合低资源设备 | 灵活内存管理,支持 GPU 加速 | 高内存需求,适合较大内存设备 |
字符与字体 | 自定义字体和字符集,支持抗锯齿 | 支持自定义字体和字符集 | 支持自定义字体和字符集 | 支持多种字体格式和优化 |
硬件加速支持 | 支持 GPU 渲染加速 | 支持 GPU 加速 | 支持 GPU 加速 | 支持 GPU 加速 |
资源需求 | 低 | 非常低 | 中等 | 较高 |
应用场景 | 中低端嵌入式设备,特别是资源受限的设备 | 低资源设备,触摸屏应用 | 高性能、高端嵌入式显示 | 高端嵌入式设备,复杂 UI 设计 |
总结
- emWin 适用于硬件资源有限且需要较低内存消耗的嵌入式系统,特别是工业控制、医疗设备等。
- LVGL 是一个开源且灵活的图形库,适用于资源有限的嵌入式系统,尤其是需要触摸屏支持的低功耗设备。
- TouchGFX 适合高性能嵌入式显示应用,支持动画和硬件加速,适用于需要复杂界面的中高端嵌入式设备。
- Qt for Embedded 适用于需要复杂图形界面和较高硬件资源支持的系统,适合大屏幕、复杂界面的嵌入式设备。
二、GUI重要结合内容
1、触摸与DMA2D
触摸屏和图形渲染是嵌入式系统中常见的输入输出方式,特别是在基于显示器的交互界面中。DMA2D(Direct Memory Access 2D)是一个图形加速器,用于提高图形绘制的效率,尤其是在有触摸输入的应用中。
-
触摸屏:嵌入式系统的触摸屏通常使用 ADC 或 I2C/SPI 接口与微控制器进行通信,获取用户触摸坐标。这些坐标会传递给图形库(如 LVGL 或 TouchGFX),并用来驱动 UI 元素的更新。
-
DMA2D:DMA2D 主要用于加速 2D 图形处理,如图像缩放、旋转、色彩填充、图形绘制等。通过 DMA 通道,数据可以直接在内存中传输,减少 CPU 的负担,提升图形的渲染速度。对于触摸屏应用,DMA2D 可以帮助加速 UI 渲染,尤其是当需要频繁更新 UI(如滑动、动画效果等)时。
例如,TouchGFX 和 LVGL 都可以通过 DMA2D 实现高效的图形绘制,尤其是在 STM32 等具有硬件加速的微控制器上。通过结合 DMA2D,系统可以实现更平滑的 UI 更新和更低的延迟。
2、系统配合
GUI 在嵌入式系统中的实现通常需要与其他系统组件(如 RTOS、硬件、输入设备等)配合工作。系统配合主要是指 GUI 与系统其他部分的协同工作。
-
RTOS(实时操作系统):在多任务的系统中,RTOS 提供了任务调度和资源管理。GUI(如 LVGL、TouchGFX 等)通常与 RTOS 配合,作为一个或多个任务存在,定期更新屏幕,处理用户输入事件等。RTOS 会负责调度这些任务的执行,确保系统响应及时。通常,GUI 会有一个或多个定时任务,用来定时刷新界面,处理触摸输入等。
-
硬件配合:嵌入式系统中的 GUI 通常需要与显示控制器、图形加速器、触摸控制器等硬件组件配合。不同的显示屏(如 TFT、OLED、LCD 等)会与不同的硬件接口(如 SPI、Parallel 等)配合,GUI 库会利用这些硬件资源来实现图形渲染。
- 显示控制器:GUI 系统通过显示控制器(如 ST7789、ILI9341 等)进行屏幕输出。GUI 库会将渲染的图像数据发送到显示控制器进行显示。
- 触摸控制器:触摸输入会通过触摸屏控制器(如 FT5x06、XPT2046)获取,GUI 库需要通过触摸控制器的接口获取输入坐标,并更新相应的 UI 元素。
3、SRAM与内存
在嵌入式系统中,GUI 的渲染需要大量的内存来存储图形数据和 UI 元素。内存的管理和分配对于 GUI 性能至关重要。
-
SRAM(静态随机存取存储器):SRAM 是嵌入式系统中的主要内存类型之一,通常用于存储屏幕缓冲区、图形资源等。由于 SRAM 速度较快,适用于图形渲染过程中需要频繁读写的区域。
-
内存分配:GUI 库(如 emWin、LVGL、TouchGFX 等)会根据系统的内存限制,分配相应的缓冲区用于存储图形数据。例如,显示缓冲区存储完整的图像数据,通常分为前缓冲区和后缓冲区(双缓冲),以避免屏幕闪烁。
-
图形库优化:有些图形库(如 TouchGFX)允许开发者配置内存使用策略,比如在 SDRAM 中存储图形数据,而在 SRAM 中存储关键 UI 元素。这样可以优化内存的使用,避免 SRAM 的不足问题。
-
-
外部内存:如果系统的内部内存(SRAM)不足,常常需要使用外部 SDRAM 或 Flash 来存储图形数据。图形库可以通过 DMA 控制器将数据从外部内存传输到显示控制器进行显示。为了提高性能,开发者通常会选择使用高带宽的内存接口(如 FSMC 或 Quad SPI)。
4、字符与图片
图形库的功能不仅限于绘制基本图形(如矩形、圆形、线条等),还包括字符和图片的显示。字符和图片的渲染是 GUI 的重要组成部分,尤其是在显示文本信息或图标时。
-
字符显示:大多数图形库(如 emWin、LVGL)提供了字符渲染的功能,可以通过字体库来显示不同的字符。字符的渲染通常依赖于位图字体(如 Monospace 或 TrueType 字体),并通过算法将字符的形状绘制到屏幕上。字体的大小、颜色、样式等可以根据需求配置。
- 内存管理:字符渲染时,需要将字符数据从内存读取到显示缓冲区。在内存不足的情况下,开发者可以选择通过外部 Flash 或 SRAM 存储字体资源,并动态加载显示需要的字符。
-
图片显示:图形库还支持图片的显示,通常通过 BMP、JPEG、PNG 等格式来存储和显示图片。不同的库对图片格式的支持不同,但基本上都提供了将图片解码并显示到屏幕上的功能。
-
图片解码:有些图形库提供了图片解码器,可以直接解码并显示图片。比如 LVGL 支持 BMP、PNG、JPEG 等格式的解码,并能够将解码后的图片显示在屏幕上。
-
内存管理:图片通常需要更大的内存来存储。例如,显示一张 320x240 分辨率的 24 位 RGB 图片,需要约 230 KB 的内存空间。对于内存有限的嵌入式系统,开发者需要优化内存管理,例如只在需要时加载图片,或者使用低分辨率图像来节省内存。
-
5、GUI配置
(1)、emWin
- 特性:专为嵌入式设备设计,适合在内存和计算资源有限的环境中运行。支持多种显示接口,能够有效管理内存和图形资源。
- 任务调度:不具备内建的任务调度,需要依赖外部的 RTOS。
- 配置:支持动态内存管理、字体和图像的配置。开发者可以根据硬件资源配置字体大小、图像分辨率等。
- 内存管理:允许开发者灵活配置显示缓冲区、字体库等内存使用策略。
(2)、LVGL
- 特性:开源的图形库,支持多种显示和输入设备。具有高度可配置性,支持动画、事件驱动、触摸输入等功能。
- 任务调度:与 RTOS 集成,利用 RTOS 的任务调度来管理 GUI 的更新。支持自定义任务周期和优先级。
- 配置:支持动态和静态内存管理,字体、图片、屏幕分辨率、触摸屏配置等都可以自定义。
- 内存管理:可以根据系统配置存储图形资源(如图片、字体等)到外部存储器。
(3)、TouchGFX
- 特性:专为高性能嵌入式图形应用设计,支持硬件加速(DMA2D)。适合于 STM32 系列微控制器。
- 任务调度:与 RTOS 集成,支持任务和定时器管理。
- 配置:支持丰富的图形界面设计,能够根据硬件特性配置图形资源、动画等。
- 内存管理:支持外部 SDRAM 存储图形资源,可以动态加载和显示图像。
(4)、Qt
- 特性:功能强大的跨平台图形框架,支持多种嵌入式系统。支持复杂的 GUI 设计,拥有丰富的控件和工具。
- 任务调度:内建的事件调度系统,支持信号与槽机制。通常与嵌入式 RTOS 配合使用,支持多任务调度。
- 配置:提供详细的图形界面和控件配置。支持字体、图片、动画、触摸输入等多种功能。
- 内存管理:需要较大的内存资源,不太适用于低内存的嵌入式系统,但在高性能系统中表现出色。