OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4247|回复: 1

在 STM32 MCU 上运行 Linux 应用程序

[复制链接]

221

主题

221

帖子

0

精华

高级会员

Rank: 4

积分
762
金钱
762
注册时间
2021-5-18
在线时间
28 小时
发表于 2021-6-16 14:09:26 | 显示全部楼层 |阅读模式
智能产品的嵌入式系统有望提供越来越多的功能。这可以通过 Linux 轻松实现,它为您希望的每种情况提供软件。但是 Linux 需要相当大的硬件资源,最显着的是内存,因此目标平台通常会相当昂贵并且具有高功耗。另一方面,现代微控制器 (MCU) 拥有大量资源,足以完成许多智能任务。使用实时操作系统 (RTOS),例如 Embox 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 上的“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 >animatedtiles.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 >animatedtiles.out
我们发现它需要大约 6 MB。我们已经在 STM32F769I 板上成功设置了 6 MB 堆大小和“动画时间”。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-6-16 15:24:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 02:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表