在STM32 MCU上运行Linux应用程序

智能产品的嵌入式系统预计越来越多的功能。通过Linux可以轻松实现这一点,为您希望的每种情况提供软件。但是Linux需要相当大的硬件资源,最值得注意的内存,因此目标平台通常相当昂贵并且具有高功耗。另一方面,现代微控制器(MCU)有很多资源足以让许多智能任务。使用诸如EMBOX RTOS的实时操作系统(RTOS),它允许使用包括MCU的Linux软件,开发人员可以更轻松地开发更便宜的智能设备,并且消耗更少的功率。

在本文中,我们讨论在运行EMBOX RTOS的嵌入式MCU上启动基本Qt应用程序。我们使用两台基于单核Cortex-M7的板(216MHz):STM32F746G-Discovery和STM32F769I-Discovery,具有480的触摸屏×272 and 800×480屏幕分辨率。

前段时间,我们设法在STM32F746-Discovery上启动标准Qt示例'MoveLocks'[Note 1]。但是,我们想进一步进一步启动并启动一个触摸屏的示例。我们选择另一个标准示例,'AnimatedTiles'。即使在桌面上也看起来是一个相当不错的例子。它是互动,因此我们可以使用触摸屏,并且看起来它看起来像3D动画。

我们想了解STM32 MCU是否可以提供足够的性能。我们不确定CPU是否是CPU’S速度足以让那种渲染场景顺利,因为我们发现,甚至屏幕刷新为800×480显示是昂贵的操作[Note 2]。

建筑

首先,让’■将我们的应用程序作为AMMOX的一部分。最简单的方法是构建应用程序 qemu.,这是一个开源仿真器。使用QEMU意味着在这种情况下,我们不需要处理内存消耗。这将有助于我们确保所有必要的组件都可提供。什么时候‘animatedtiles’已启动QEMU,我们很容易添加必要的组件来配置STM32的文件。

首次在目标板上发布

我们在目标板上成功启动了“AnimActentTiles”STM32F746G-Discovery,但我们注意到只绘制了屏幕的上半部分。当然,我们可以尝试通过立即在板上调试来解决麻烦,但有更容易的方法:我们可以首先启动和调试Linux环境中的示例。

在主人上调试

要运行此示例并调试应用程序,您需要 QT库 本身以及QVFB,这是一个提供虚拟屏幕的QT应用程序。您可以按照描述的描述构建QVFB 官方文件.

然后您可以使用所需的屏幕分辨率启动QVFB(480×272对于STM32F746G-Discovery):

./qvfb -width 480 -height 272 -nocursor 

您还应使用嵌入式配置文件构建Qt库,即“-embedded”选项。此选项旨在运行Qt,没有X11或现有的图形环境,将使用QWS(QT窗口系统)。此外,我们还禁用了其他一些不必要的选项和模块。生成的配置线是以下内容:

./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 

最后,让我们建立并启动'AnimActenttiles'。构建阶段像Qt一样常用(qmake;制作;)。您应该在启动应用程序时将QVFB指定为显示:

./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0

我们在屏幕上半部分拍摄了同样的照片。我们在源代码(示例/动画/动画/ main.cpp)中找到了应用程序以“查看 - >show()“,这意味着不在全屏模式下。之后,我们完全相信,屏幕的唯一前半部分被用来显示应用程序。我们修改了“AnimeStiles”的代码一点,添加了“-fullscreen”选项。

在STM32F746-Discovery上启动

我们在EMMOX中建立了修改的应用程序,并在QEMU中检查了它成功运行。但是当我们在目标板上启动应用程序时,我们收到了“内存中的”错误。这意味着我们配置中堆的大小对于应用程序来说是不够的。我们决定在Linux中使用丰富的开发工具来解决问题i.e.估计所需的堆大小。

我们开始使用Valgrind申请。 valgrind. 是内存调试和分析的工具, mass 是堆分析器(它是Valgrind的一部分)。

$ valgrind --tool=massif --massif-out-file=animatedtiles.massif./examples/animation/animatedtiles/animatedtiles -qws -fullscreen
$ ms_print animatedtiles.massif > animatedtiles.out

并发现应用程序需要约2.7 MB堆大小的堆大小。

我们将堆大小设置为3 MB在Emmox Config中,并再次启动我们的演示。它在全屏模式下成功运行。

在STM32F769I-Discovery上推出。

我们还想尝试类似板的示例,但显示器更大。这个例子使用了 STM32F769I-Discovery 800×480显示分辨率。在这种情况下,它仅需16位颜色模式(800x480x2 = 768000)中仅对帧缓冲区进行了几乎100MB,但该板上有足够的(16MB)外部SDRAM。所以我们只需要估计堆的大小。

我们以新的决议启动了QVFB(800×480):

$./qvfb -width 800 -height 480 -nocursor & 

并使用Valgrind作为上一段时间:

$ valgrind --tool=massif --massif-out-file=animatedtiles.massif./examples/animation/animatedtiles/animatedtiles -qws -fullscreen
$ ms_print animatedtiles.massif > animatedtiles.out

我们发现它需要大约6 MB。我们已在STM32F769I板上设置了6 MB堆大小和“动画仪”。


图1:在AMMOX RTOS下的STM32F769I-Discovery Poard上的Qt AnimationTiles示例。 (资源: 澳大乐组织)

您可以看到它在此视频(下面)中的工作原理,您可以如我们所述的描述自行复制 GitHub Wiki..

笔记:

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

安东尼邦德纳维夫 是EMBOX RTO的创始人。安东尼2003年毕业于圣彼得堡电工大学(Leti),拥有电气工程硕士学位,并参加圣彼得堡州立大学的研究生课程专门从事软件工程。他在嵌入式和系统编程中有超过20年。
Alexander Kalmuk. 是EMBOX的Cofounter。亚历山大于2014年毕业于圣彼得堡州立大学,硕士学位和软件工程硕士学位,并参加了圣彼得堡州立大学的研究生课程专门从事控制理论。他在嵌入式系统编程中有超过10年。

相关内容:

更嵌入, 订阅嵌入式’S每周电子邮件时事通讯.

发表评论

本网站使用AkisMet减少垃圾邮件。 了解如何处理评论数据.