利用Embox实时操作系统在嵌入式单片机上启动一个基本的Qt应用程序

文章:Anton Bondarev和Alexander Kalmuk

使用像Embox这样的实时操作系统(它允许在包括mcu在内的任何地方使用Linux软件),开发人员可以更容易地开发出价格更低、耗电更少的智能设备。

人们期望越来越多的嵌入式系统用于智能产品。这可以很容易地用Linux实现,Linux为您希望的任何情况提供了软件。但是Linux需要相当大的硬件资源,尤其是内存,所以目标平台通常会非常昂贵,并且有很高的功耗。另一方面,现代微控制器(mcu)拥有大量资源,足以完成许多智能任务。使用Embox RTOS这样的实时操作系统(RTOS),它允许在包括mcu在内的任何地方使用Linux软件,开发人员可以更容易地开发价格更低、能耗更低的智能设备。

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

一段时间以前,我们设法启动了一个标准的Qt示例' moveblocks '在STM32F746-Discovery [注1.].然而,我们想更进一步,推出一个带有触摸屏的例子。我们选择了另一个标准示例“animatedtiles”。这是一个相当不错的例子,即使在台式机上看起来也很酷。它是交互式的,因此我们可以使用触摸屏,而且它看起来像3D动画。

我们想了解STM32单片机能否提供足够的性能。我们不确定CPU的速度是否足以让渲染场景变得流畅,因为我们发现,对于800×480显示,即使是屏幕刷新也是一个昂贵的操作[笔记2].

建造

首先,让我们作为Ammox的一部分建立我们的应用程序。最简单的方法是构建应用程序qemu.,这是一个开源模拟器。使用QEMU意味着在这种情况下不需要考虑内存消耗。这将帮助我们确保所有必要的组件都可用。当“animatedtiles”在QEMU上启动时,我们可以很容易地添加必要的组件到STM32的配置文件中。

首次在目标板上发布

我们成功地在我们的目标板STM32F746G-Discovery上开始“animatedtiles”,但我们注意到只有屏幕的上半部分被绘制。当然,我们可以尝试通过立即在板上调试来解决问题,但有一种更简单的方法:我们可以首先在Linux环境中启动和调试示例。

在主人上调试

要运行此示例并调试应用程序,您需要Qt库QVFB是一个提供虚拟屏幕的Qt应用程序。中的描述可以构建QVFB官方文档

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

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

最后,让我们构建并开始“animatedtiles”。构建阶段与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是内存调试和分析的工具,地块是一个堆分析器(它是Valgrind的一部分)。

$ valgrind --tool = massif --massif-out-file = animatedtiles.massif。/ examples / Animation / AnimationTiles / AnimationTiles -QWS -FullScreen美元ms_print animatedtiles。地块> animatedtiles.out

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

我们在Embox配置中将堆大小设置为3mb,然后再次开始我们的演示。它在全屏模式下成功运行。

在STM32F769I-Discovery上推出。

我们还想尝试类似板的示例,但显示器更大。此示例使用800×480显示分辨率的STM32F769I-Discovery。在这种情况下,它仅需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 / AnimationTiles / AnimationTiles -QWS -FullScreen美元ms_print animatedtiles。地块> animatedtiles.out

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


图1:在AMMOX RTOS下的STM32F769I-Discovery Poard上的Qt AnimationTiles示例。(来源: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多年的经验。

亚历山大Kalmuk是EMBOX的Cofounter。亚历山大于2014年毕业于圣彼得堡州立大学,硕士学位和软件工程硕士学位,并参加了圣彼得堡州立大学的研究生课程专门从事控制理论。他在嵌入式系统编程中有超过10年。

发表评论