亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 嵌入式

在 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 中的描述自己重现结果。

注意事项:

  1. https://habr.com/ru/company/embox/blog/459730/](俄语,但也有第三方英文翻译版本:https://sudonull.com/ post/25508-Porting-Qt-to-STM32-Embox-Blog
  2. https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a

安东·邦达列夫 是 Embox RTOS 的创始人。 Anton 于 2003 年毕业于圣彼得堡电工大学 (LETI),获得电气工程硕士学位,并在圣彼得堡州立大学攻读软件工程专业的研究生课程。他在嵌入式和系统编程方面拥有 20 多年的经验。 亚历山大·卡尔穆克 是 Embox RTOS 的联合创始人。 Alexander 于 2014 年毕业于圣彼得堡国立大学,获得数学和软件工程硕士学位,并在圣彼得堡国立大学攻读控制理论专业的研究生课程。他在嵌入式系统编程方面拥有超过 10 年的经验。

相关内容:

有关 Embedded 的更多信息,请订阅 Embedded 的每周电子邮件通讯。


嵌入式

  1. 铌在口腔医学中的应用
  2. 钛在手表中的应用
  3. Linux 云计算指南
  4. Linux 云托管与 Windows 云托管
  5. 染料的应用分类
  6. ST 推出带有 Linux 发行版的 STM32MP1 微处理器系列
  7. 电源管理 IC 支持应用处理器系列
  8. 传感器遥测 2.0.1
  9. Java 10 - 类数据共享
  10. 什么是运行键?
  11. PLCnext 上的集群管理?
  12. PLCnext 控件上的 Java 应用程序