嵌入式MCU上启动基本的Qt应用程序的案例分析

描述

  作者:Alexander Kalmuk和Alexander Kalmuk

嵌入式系统有望为智能产品提供越来越多的功能。这可以通过Linux轻松实现,Linux为您所需要的每种情况提供软件。但是Linux需要相当大的硬件资源,尤其是内存,因此目标平台通常会很昂贵并且功耗很高。另一方面,现代微控制器(MCU)具有很多资源,足以应付许多智能任务。使用Embox RTOS之类的实时操作系统(RTOS),该操作系统允许在包括MCU在内的所有地方使用Linux软件,开发人员可以更轻松地开发成本更低,功耗更低的智能设备。

在本文中,我们讨论在运行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上启动“动画”时,我们可以轻松地将必要的组件添加到STM32的配置文件中。

首次在目标板上启动

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

在主机上调试

要运行此示例并调试您的应用程序,您需要Qt库本身以及QVFB(它是提供虚拟屏幕的Qt应用程序)。您可以按照官方文档中的说明构建QVFB 。

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

./qvfb-宽度480-高度272 -nocursor 

您还应该使用嵌入式配置文件(即带有“ -embedded”选项)来构建Qt库。此选项旨在在没有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的例子 

最后,让我们构建并启动“动画”。构建阶段与Qt(qmake; make;)一样。启动应用程序时,应指定QVFB作为显示:

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

屏幕的上半部分显示了相同的图片。我们在源代码(examples / animation / animatedtiles / main.cpp)中发现,该应用程序以“ view-> show()”开头,这意味着不处于全屏模式。之后,我们完全相信屏幕的唯一上半部分用于显示应用程序。我们稍微修改了“动画”代码,并添加了“ -fullscreen”选项。

在STM32F746-发现上启动

我们在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上启动。

我们还想在类似的板上尝试该示例,但显示更大。本示例使用的显示分辨率为800×480的STM32F769I-Discovery。在这种情况下,仅16位彩色模式(800x480x2 = 768000)的帧缓冲区仅需要将近1MB,但是此板上有足够的(16MB)外部SDRAM。因此,我们只需要估计堆的大小即可。

我们以新的分辨率(800×480)启动了QVFb:

$。/ qvfb-宽度800-高度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。我们已经设置了6 MB的堆大小,并在STM32F769I板上成功启动了“动画时间”。

图1:Embox RTOS下STM32F769I-DISCOVERY板上的QT动画片段示例。(来源:Embox)

编辑:hfy

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分