在 STM32 MCU 上运行 Linux 应用程序
智能产品的嵌入式系统有望提供越来越多的功能。这可以通过 Linux 轻松实现,它为您希望的每种情况提供软件。但是 Linux 需要相当大的硬件资源,最显着的是内存,因此目标平台通常会相当昂贵并且具有高功耗。另一方面,现代微控制器 (MCU) 拥有大量资源,足以完成许多智能任务。使用 Embox RTOS 等实时操作系统 (RTOS),允许在任何地方使用 Linux 软件,包括 MCU,开发人员可以更轻松地开发更便宜、耗电更少的智能设备。
在本文中,我们将讨论在运行 Embox RTOS 的嵌入式 MCU 上启动基本 Qt 应用程序。我们使用两个基于单核 Cortex-M7 的板 (216MHz):STM32F746g-Discovery 和 STM32F769i-Discovery,它们分别具有 480×272 和 800×480 屏幕分辨率的触摸屏。
前段时间,我们设法在 STM32F746-Discovery [注 1] 上启动了一个标准的 Qt 示例“moveblocks”。然而,我们想更进一步,推出一个带有触摸屏的示例。我们选择了另一个标准示例,“animatedtiles”。这是一个相当不错的例子,即使在桌面上看起来也很酷。它是交互式的,因此我们可以使用触摸屏,而且它看起来像 3D 动画。
我们想了解 STM32 MCU 是否可以提供足够的性能。我们不确定 CPU 的速度是否足以使渲染场景流畅,因为我们发现,即使是 800×480 显示器的屏幕刷新也是一项昂贵的操作 [注 2]。
建筑
首先,让我们将我们的应用程序构建为 Embox 的一部分。最简单的方法是为 QEMU 构建应用程序,QEMU 是一个开源模拟器。使用 QEMU 意味着在这种情况下我们不需要处理内存消耗。这将帮助我们确保所有必要的组件都可用。在 QEMU 上启动“animatedtiles”后,我们轻松地将必要的组件添加到 STM32 的配置文件中。
首次在目标板上启动
我们在目标板 STM32F746G-Discovery 上成功启动了“animatedtiles”,但我们注意到只绘制了屏幕的上半部分。当然,我们可以尝试通过立即在板上调试来解决问题,但还有一个更简单的方法:我们可以先在Linux环境下启动并调试示例。
在主机上调试
要运行此示例并调试您的应用程序,您需要 Qt 库本身以及 QVFB,这是一个提供虚拟屏幕的 Qt 应用程序。您可以按照官方文档中的描述构建 QVFB。
然后您可以启动具有所需屏幕分辨率的 QVFB(STM32F746G-Discovery 为 480×272):
./qvfb -width 480 -height 272 -nocursor
您还应该使用嵌入式配置文件构建 Qt 库,即使用“-embedded”选项。此选项旨在在没有 X11 或现有图形环境的情况下运行 Qt,将改用 QWS(Qt 窗口系统)。我们还禁用了一些其他不必要的选项和模块。生成的配置行如下:
./configure -opensource -confirm-license -debug \ -embedded -qt-gfx-qvfb -qvfb \ -no-javascript-jit -no-script -no-scripttools \ -no-qt3support -no -webkit -nomake 演示 -nomake 示例
最后,让我们构建并启动“animatedtiles”。构建阶段与 Qt 一样(qmake; make; )。您应该在启动应用程序时指定 QVFB 作为显示:
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
我们在屏幕的上半部分看到了相同的图片。我们在源代码(examples/animation/animatedtiles/main.cpp)中发现应用程序以“view->show()”开头,这意味着不是全屏模式。在那之后,我们完全相信屏幕的唯一上半部分用于显示应用程序。我们稍微修改了'animatedtiles'的代码,添加了'-fullscreen'选项。
启动 STM32F746-discovery
我们在 Embox 中构建了我们修改后的应用程序,并检查它是否成功地在 QEMU 上运行。但是当我们在目标板上启动应用程序时,我们收到了“内存不足”错误。这意味着我们配置中的堆大小对于应用程序来说是不够的。我们决定在 Linux 中使用丰富的开发工具来解决问题,即估计所需的堆大小。
我们已经用 valgrind 开始了我们的应用程序。 Valgrind 是一个用于内存调试和分析的工具,Massif 是一个堆分析器(它是 Valgrind 的一部分)。
$ valgrind --tool=massif --massif-out-file=animatedtiles.massif./examples/animation/animatedtiles/animatedtiles -qws -fullscreen $ ms_print animationtiles.massif> animationtiles.out
并发现应用程序需要大约 2.7 MB 的堆大小。
我们在 Embox 配置中将堆大小设置为 3 MB,然后再次开始我们的演示。在全屏模式下成功运行。
在 STM32F769I-Discovery 上启动。
我们还想在类似的板上尝试这个例子,但显示器更大。本示例使用了 STM32F769I-Discovery,显示分辨率为 800×480。在这种情况下,仅 16 位颜色模式 (800x480x2=768000) 的帧缓冲区就需要将近 1MB 的空间,但该板上有足够的 (16MB) 外部 SDRAM。所以我们只需要估计堆的大小。
我们以新的分辨率 (800×480) 启动 QVFb:
$./qvfb -width 800 -height 480 -nocursor &
和上次一样使用valgrind:
$ valgrind --tool=massif --massif-out-file=animatedtiles.massif./examples/animation/animatedtiles/animatedtiles -qws -fullscreen$ ms_print animationtiles.massif> animationtiles.out
我们发现它需要大约 6 MB。我们已经在 STM32F769I 板上设置了 6 MB 的堆大小并成功启动了“animatedtimes”。
图 1:在 Embox RTOS 下 STM32F769I-DISCOVERY 板上的 QT 动画示例。 (来源: Embox)
您可以在此视频(如下)中看到它是如何工作的,并且您可以按照我们的 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
安东·邦达列夫 是 Embox RTOS 的创始人。 Anton 于 2003 年毕业于圣彼得堡电工大学 (LETI),获得电气工程硕士学位,并在圣彼得堡州立大学攻读软件工程专业的研究生课程。他在嵌入式和系统编程方面拥有 20 多年的经验。 亚历山大·卡尔穆克 是 Embox RTOS 的联合创始人。 Alexander 于 2014 年毕业于圣彼得堡国立大学,获得数学和软件工程硕士学位,并在圣彼得堡国立大学攻读控制理论专业的研究生课程。他在嵌入式系统编程方面拥有超过 10 年的经验。
相关内容:
- 在关键应用程序中使用 Linux:比如混合油和水?
- 我的物联网项目为何选择 Yocto 项目?
- 预计对汽车级 Linux 专业知识的需求
- MCU 支持 Linux 用于工业物联网
- 开源平台以嵌入式 Linux 为目标物联网
- 嵌入式 Linux 设备驱动程序:了解它们的作用
- 嵌入式 Linux 的 OTA 更新,第 1 部分 - 基础知识和实施
- 如何在 3 美元的 WiFi 设备上安装安全的嵌入式 Web 服务器
- 掌握互联系统永无止境的软件开发生命周期——否则它就会掌握你
有关 Embedded 的更多信息,请订阅 Embedded 的每周电子邮件通讯。
嵌入式