项目概述与特点¶
什么是 EmbeddedGUI¶
EmbeddedGUI (EGUI) 是一个专为资源受限的嵌入式系统设计的轻量级 C 语言 GUI 框架。它的目标运行环境为 RAM 不足 8KB、ROM 不足 64KB、CPU 主频约 100MHz 且无需浮点运算单元的微控制器。通过局部帧缓冲 (PFB) 设计,EGUI 在极低的内存占用下实现了丰富的 UI 功能,包括触控交互、流畅动画和类 Android 的应用开发模式。
项目仓库地址:
Gitee: EmbeddedGUI (gitee.com)
GitHub: EmbeddedGUI (github.com)
项目采用 MIT 许可证,可自由使用于商业和非商业项目。
设计理念¶
EGUI 的核心设计围绕四个关键理念展开:
局部帧缓冲 (PFB)¶
传统 GUI 框架需要一整块屏幕大小的帧缓冲区 (例如 240x320 RGB565 需要约 150KB RAM),这在大多数 MCU 上是不可承受的。EGUI 采用局部帧缓冲方案,仅使用一小块缓冲区 (如 30x40 像素 = RGB565 下仅 2400 字节),通过分块渲染来绘制整个屏幕,将 RAM 需求降低到 4KB 以下。
PFB 的宽度和高度建议优先选成屏幕尺寸的整数约数。例如对于 240x320 的屏幕,PFB 可以设为 30x40 (各除以 8)。如果不能整除,框架也会处理边界块。PFB 越大,单次渲染覆盖的面积越大,刷新次数越少;PFB 越小,RAM 占用越低。EGUI 对 PFB 做了特别优化,使得小 PFB 和大 PFB 之间的性能差异不大,开发者可以根据可用 RAM 灵活选择。
脏矩形机制¶
EGUI 追踪界面上发生变化的区域,仅重绘这些”脏”区域而非整个屏幕。当界面上只有一个按钮状态变化时,框架只会重绘该按钮所在的矩形区域,而非刷新整个屏幕。这不仅大幅降低了 CPU 负载和功耗,还能在局部刷新场景下实现更高的帧率,非常适合电池供电的嵌入式设备。
定点数运算¶
所有数学计算 (三角函数、插值、贝塞尔曲线等) 均使用定点数实现,完全避免浮点运算。定点数运算库 egui_fixmath 提供了 sin、cos、atan2、sqrt 等常用数学函数的定点版本。这确保了在没有 FPU 的低端 MCU (如 Cortex-M0/M0+) 上也能高效运行,不会因为软件浮点模拟而出现卡顿。
类 Android API¶
EGUI 借鉴了 Android 的 UI 开发模式,提供了开发者熟悉的编程范式:
Activity: 管理页面生命周期 (onCreate、onResume、onPause、onDestroy),支持页面栈导航
ViewPage: 实现左右滑动切页,搭配 PageIndicator 显示当前页码
LinearLayout / GridLayout: 自动布局容器,按垂直/水平方向或网格排列子控件
Dialog / Toast: 弹窗和消息提示,与 Android 用法一致
对于熟悉 Android 开发的工程师来说,上手成本极低。即使没有 Android 经验,这套直觉式的 API 设计也很容易理解。
核心特点¶
极低资源占用: 不到 4KB RAM (含帧缓冲) + 64KB ROM 即可运行,适合 Cortex-M0/M0+ 等低端 MCU。
局部帧缓冲 (PFB): 无需全屏帧缓冲,小 PFB 和大 PFB 性能差异不大,灵活适配不同 RAM 容量。
脏矩形优化: 仅重绘变化区域,省电省算力,静态页面几乎零 CPU 开销。
定点数运算: 全部代码使用定点运算,无需 FPU 支持,兼容最低端 MCU。
抗锯齿渲染: 基本图形 (线、圆、圆环、圆角矩形、扇形等) 均支持高质量抗锯齿。
60+ UI 控件: 包括按钮、标签、滑块、进度条、图表、时钟、日历、列表等丰富控件。
完整动画系统: 支持 Android 的全部动画类型 (平移、缩放、透明度、颜色),提供 9 种插值器。
主题系统: 内置主题支持,可统一控制控件的外观风格。
图表控件: 支持折线图、柱状图、饼图、散点图,满足数据可视化需求。
UTF-8 字体支持: 支持多语言文本渲染,包括中文等 Unicode 字符。
图片透明通道: 支持带 Alpha 通道的图片渲染,实现图片半透明叠加效果。
双缓冲支持: 可充分利用 SPI/DMA 写入屏幕的间隙时间,提升刷新效率。
Mask 支持: 支持遮罩绘制,实现圆角图片、异形裁剪等效果。
多色深支持: 支持 RGB8 (8-bit)、RGB565 (16-bit)、RGB32 (32-bit) 多种显示色深。
纯 C 实现: 全部由 C99 代码编写,支持 C++ 调用,无第三方依赖库。
轮询结构: 基于轮询驱动,无需 OS 支持,可在裸机环境直接运行。
跨平台开发: 可在 PC (Windows/Linux/macOS) 上开发调试,代码直接部署到 MCU 上运行。
与其他嵌入式 GUI 框架的定位对比¶
嵌入式 GUI 领域有多个优秀的开源框架,它们各有侧重:
特性 |
EmbeddedGUI |
LVGL |
GuiLite |
Arm-2D |
|---|---|---|---|---|
最低 RAM 需求 |
<4KB |
~32KB |
~4KB |
<1KB |
最低 ROM 需求 |
<64KB |
~100KB |
<10KB |
~6KB |
PFB 支持 |
原生支持 |
v9+ 支持 |
不支持 |
原生支持 |
抗锯齿 |
内置支持 |
内置支持 |
不支持 |
部分支持 |
控件数量 |
60+ |
30+ |
~5 |
无内置 |
API 风格 |
类 Android |
自定义 |
极简 |
底层绘图 |
动画系统 |
Android 风格 |
内置 |
无 |
场景播放器 |
浮点依赖 |
无 (定点) |
可选 |
无 |
无 (定点) |
EGUI 的定位介于 LVGL 的功能丰富和 GuiLite/Arm-2D 的极致精简之间: 它在保持低资源占用的同时,提供了丰富的控件和完善的动画系统,特别适合那些”资源不足以跑 LVGL,但又需要复杂 UI”的场景。
注意: 以上对比仅供参考,各框架都在持续演进。建议根据具体项目需求选择最合适的方案。
适用场景¶
EGUI 适合以下类型的嵌入式产品:
可穿戴设备: 智能手表、手环、运动追踪器等小屏幕设备,内置模拟时钟、数字时钟、心率、活动环等专用控件
工业仪表: 仪表盘、传感器监控面板,利用图表控件 (折线图、柱状图) 展示实时数据
家电控制面板: 空调、洗衣机、电饭煲、热水器等产品的触控界面
医疗设备: 便携式医疗监测设备的显示界面
物联网终端: 智能家居网关、环境监测终端等
教育和原型: 快速搭建嵌入式 GUI 原型,PC 上开发验证,直接部署到 MCU
总结来说,任何需要在 RAM <8KB、ROM <64KB 的 MCU 上实现图形界面的场景,EGUI 都是一个值得考虑的选择。
支持的平台¶
EGUI 采用分层架构,应用代码与平台无关,仅 Porting 层需要适配:
PC 模拟器: Windows, Linux, macOS (基于 SDL2),用于日常开发和调试
ARM Cortex-M: STM32G0 等 MCU (通过 ARM GCC 交叉编译),项目提供了完整的移植参考
QEMU: ARM 虚拟化环境,用于自动化测试和性能基准测试,提供微秒级计时精度
WebAssembly: 通过 Emscripten 编译,可在浏览器中直接体验 EGUI 的各种示例
PC 上编写的应用代码和资源文件可以直接在 MCU 上使用,真正实现”PC 开发,MCU 部署”的工作流。
快速体验¶
如果你已经配置好了开发环境 (参见 环境搭建),可以立即编译运行:
# 编译并运行最简单的示例
make all APP=HelloSimple
make run
# 体验更多控件
make all APP=HelloBasic APP_SUB=slider
make run
# 查看图表控件(HelloChart 内含 line / scatter / bar / pie 四页)
make all APP=HelloChart
make run