在 STM32 MCU 上运行 Qt:基于 Embox RTOS 的实战性能演示
嵌入式系统正面临提供更丰富功能的日益增长的需求。Linux 拥有庞大的库和工具生态系统,但其硬件要求(尤其是内存)往往会推高成本和功耗。现代微控制器(MCU),如 STM32 系列,在保持低成本和低功耗的同时,为许多智能应用提供了充足的资源。
使用能够托管 Linux 软件的实时操作系统(RTOS)——例如 Embox RTOS——可让开发者在 MCU 上利用 Linux 生态。本文将演示如何在两款 Cortex-M7 STM32 开发板(STM32F746G-Discovery 和 STM32F769I-Discovery)上,基于 Embox 运行 Qt 应用程序。
背景
此前我们已在 STM32F746-Discovery 板上演示了 Qt 的 "moveblocks" 示例。本文将扩展至 "animatedtiles" 示例,该示例提供交互式 3D 风格图形,适合触摸屏操作。我们旨在评估 MCU 的 CPU 和内存能否在 480×272 或 800×480 分辨率屏幕上维持流畅渲染。
构建应用程序
我们首先为 QEMU(开源模拟器)构建 Qt 示例。在 QEMU 中运行应用可避免预分配内存,确保所有依赖项均已就绪。验证通过后,将所需组件添加至 STM32 配置文件中。
目标板首次启动
应用程序可在 STM32F746G-Discovery 上启动,但屏幕仅显示上半部分内容。虽可直接在板卡上调试,但利用主机环境进行初步调试效率更高。
主机端调试
为运行和调试示例,需安装 Qt 库和 QVFB(Qt 虚拟帧缓冲)。QVFB 提供虚拟显示供 Qt 渲染。按官方说明构建 QVFB。
以开发板分辨率启动 QVFB:
./qvfb -width 480 -height 272 -nocursor
使用嵌入式配置编译 Qt(禁用 X11)并精简模块:
./configure -opensource -confirm-license -debug \ -embedded -qt-gfx-qvfb -qvfb \ -no-javascript-jit -no-script -no-scripttools \ -no-qt3support -no-webkit -nomake demos -nomake examples
构建并通过 QVFB 启动 animatedtiles:
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
应用再次仅占据屏幕上半部分。检查 examples/animation/animatedtiles/main.cpp 发现视图以窗口模式显示。添加 -fullscreen 参数即可解决该问题。
部署至 STM32F746-Discovery
修改源码后,我们为 Embox 重新构建应用并在 QEMU 中运行。在实体板上启动时出现 "Out Of Memory" 错误,表明堆内存不足。为确定所需大小,我们使用 Valgrind 的 Massif 工具。
valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen ms_print animatedtiles.massif > animatedtiles.out
Massif 报告堆内存需求约 2.7 MB。在 Embox 配置中将堆增至 3 MB 后,演示可全屏运行。
部署至 STM32F769I-Discovery
STM32F769I-Discovery 配备 800×480 显示屏和 16 MB 外部 SDRAM。帧缓冲本身约占 0.8 MB(800×480×2 字节)。仅需调整堆大小。
为更高分辨率启动 QVFB:
./qvfb -width 800 -height 480 -nocursor &
再次运行 Massif:
valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen ms_print animatedtiles.massif > animatedtiles.out
Massif 报告堆需求约 6 MB。将堆配置为 6 MB 后,STM32F769I 板可全屏运行。

请观看下方视频演示,或访问我们的 GitHub Wiki 按步骤复现结果。
参考资料
- https://habr.com/ru/company/embox/blog/459730/(俄文,英文版见 https://sudonull.com/post/25508-Porting-Qt-to-STM32-Embox-Blog)
- https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a
Anton Bondarev 是 Embox RTOS 创始人。2003 年于圣彼得堡国立电技大学(LETI)获电气工程硕士学位,后在圣彼得堡国立大学完成软件工程研究生课程。拥有 20 余年嵌入式与系统编程经验,主导 Embox 项目发展。
Alexander Kalmuk 是 Embox RTOS 联合创始人。2014 年于圣彼得堡国立大学获数学与软件工程硕士学位,后攻读控制理论研究生课程。拥有十余年嵌入式系统编程经验,是 Embox 核心贡献者。
相关内容
- 在关键应用中使用 Linux:如油水难容?
- 为何选择 Yocto Project 用于物联网项目?
- 预判汽车级 Linux 专业知识需求
- MCU 让工业物联网实现 Linux 化
- 开源平台瞄准嵌入式 Linux 物联网
- 嵌入式 Linux 设备驱动:理解其角色
- 嵌入式 Linux OTA 更新,第 1 部分——基础与实现
- 如何在 3 美元 WiFi 设备上安装安全嵌入式 Web 服务器
- 驾驭连接系统无休止的软件开发生命周期——否则它将驾驭你
订阅《Embedded》周刊,获取更多嵌入式技术资讯。
嵌入式
- Sensor Telemetry 2.0.1:基于 Azure IoT Hub 的高精度温度监控系统
- PLCnext 集群管理:利用 Kubernetes 赋能工业自动化
- 利用 Jlink 优化 PLCnext Control 上的 Java 9+ 应用
- 顺砌法详解:砖砌体最基础的连接工艺
- ST 推出 STM32MP1:双核 Arm Cortex MP1,搭载 OpenSTLinux 与低功耗性能
- ROHM 发布适配 NXP i.MX 8M Nano 的 BD71850MWV PMIC
- Linux 为何驱动云计算:全面指南
- Linux云主机 vs Windows云主机:如何为业务选择最佳平台
- 铌在口腔医学中的全链路应用:从种植体到辐射防护
- 钛在手表中的应用:创新、防过敏设计与轻量化性能
- Java 10 应用类数据共享 (AppCDS):加速启动与减少内存占用
- 按应用分类的染料体系:从活性到分散染料的行业全景