找回密码
 立即注册
Qt开源社区 门户 查看内容

重磅:MCU上可以用Qt进行GUI开发了,内附演示视频!

2019-5-10 15:26| 发布者: admin| 查看: 11248| 评论: 0

摘要: 本文由电子工程师时间译自自Qt官方博客,可以直接拖到文章后面看演示视频。是否有可能在微控制器(MCU)上使用Qt进行软件开发,以及Qt是否可以在没有操作系统(“裸机”)的情况下运行。今天我们将回答这些问题并向 ...

本文由电子工程师时间译自自Qt官方博客,可以直接拖到文章后面看演示视频。

是否有可能在微控制器(MCU)上使用Qt进行软件开发,以及Qt是否可以在没有操作系统(“裸机”)的情况下运行。

今天我们将回答这些问题并向您展示一些具体的例子。

使用MCU有什么意义?


MCU是单个集成电路上的小型计算机。它们与芯片上系统(SoC)相似,尽管不太复杂。微控制器用于汽车发动机控制系统,医疗设备,可穿戴设备,遥控器,办公设备,电器,电动工具,玩具和其他嵌入式系统等自动控制产品和设备。使用MCU的主要优势在于体积小,成本相对较低 - 特别是对于大批量生产。

因此,我们已经可以从定义中看到MCU的主要特性:小尺寸,低功耗以及低成本。因此,我们可以说使用MCU的主要目的是节约成本。

为什么要在MCU上使用Qt?


较低的计算能力对软件开发工具的选择有一定的限制,特别是如果我们谈论GUI时,例如关于固件大小,运行时内存使用情况以及GUI如何尽可能的“花哨”。

今天,我们没有用于MCU的通用GUI库。当然,有些解决方案可以解决某些特定MCU GUI模型的部分任务,但这还不够。而且很少(或实际上从来没有)库是以“跨平台能力”为基础创建的。

虽然一些商业工具包其实很不错,但在大多数情况下,它们都有一个封闭的源代码。所以你要购买一个“黑匣子”,并冒着发现自己锁定供应商的风险。

现在想象一下,如果我们可以使用Qt框架,这将会是多么的棒:跨平台和全面的类库(包括GUI),优秀的文档和大量的例子,以及一个梦幻般的开源社区。

不幸的是,到目前为止,由于上述硬件限制,Qt(用于设备创建的Qt)的嵌入式开发仅在Cortex-A级别的设备上正式支持,主要是在Linux和一些商业RTOS(INTEGRITY,QNX和VxWorks) 。

但今天,这种情况已经改变。

研究

入门


所以,我们开始研究:研究在MCU硬件上运行Qt的可能性。

我们从一开始就清楚我们正在谈论的是哪些微控制器,因为有些人可能会开始梦想拥有12Mhz CPU和128字节RAM的MCU。这将是一个很大的差距,因为Qt当前的硬件要求是:

  • 256 MB的RAM;

  • 500 MHz CPU(首选1 GHz);

  • OpenGL ES 2.0支持。

我们选择的研究板是:



STM32F469 - ARM Cortex-M4,FPU单元单精度



STM32F746 - ARM Cortex-M7,单精度FPU单元,L1高速缓存(数据/指令)



STM32F769 - ARM Cortex-M7,双精度FPU单元,L1高速缓存(数据/指令)

从规格中可以看出,他们的硬件资源比Qt“正式版本”要求的要低。

关于OpenGL支持,感谢Qt Quick 2D Renderer,  它不是一个严格的要求,因为我们可以使用光栅绘制引擎渲染我们的图形。

我们开始移植以下Qt模块:

  • Qt Core ;

  • Qt GUI ;

    • Qt Widgets ;

    • Qt QML ;

    • Qt Quick Controls 2 ;

  • Qt网络。

移植


你如何将Qt移植到不同的目标平台上?那么,首先我们需要了解Qt的功能究竟需要什么。一般来说,您需要满足两个主要要求:

  • POSIX兼容操作系统;

  • C ++ 11兼容的编译器。

我们从C ++ 11的要求开始。在5.7版本中,Qt开始要求平台支持C ++ 11,因为我们的目标是提供功能强大且现代化的C ++框架。但是,如果您的平台最多只能支持C ++ 98,那么您当然可以尝试使用Qt 5.6(或更早版本)来实现,但是考虑到引入了新的配置系统(所谓的Qt Lite)这一事实只有使用Qt 5.8,将Qt“挤入”MCU环境将是一项艰巨的任务。

现在关于  POSIX - 兼容操作系统接口。这实际上回答了为什么Qt不能用于“裸机”的问题。在Qt中,我们使用了大量的POSIX功能(并行线程,MMAP,fopenopen等),所以如果我们想在裸机上运行Qt,我们需要创建自己的实现POSIX的-基本上实现自己的操作系统。幸运的是,我们的研究并非如此。

我们决定使用开源RTOS,我们选择了RTEMS  最显着的特性:

  • 简单;

  • POSIX支持;

  • 支持各种文件系统,包括NFS和FAT;

  • 包括FreeBSD TCP / IP协议栈的一个端口;

  • C ++ 11支持;

  • 开源许可证(修改后的GPL);

  • 一个  活跃的 社区。

将Qt移植到RTEMS的过程包括以下步骤:

  • 配置板载时钟发生器(频率),存储器(SDRAM,缓存,MMU),初始化外设等;

  • 端口RTEMS到STM32F4 / F7(创建BSP);

  • Qt到RTEMS:

    • 在Qt Core中添加对它的支持;

    • 创建一个新的QPA插件。

移植Qt本身可以在下面的插图中展示:



我们不会详细描述整个过程(从配置电路板到创建新的QPA),尽管这可能是研究中最有趣的部分。但这篇文章的目的只是为了告诉你有关这项研究,而不是提供一步一步的手册。如果您有兴趣开展试点项目,请联系我们并提交您的请求。

结果


为了演示结果,我们为每个演示板应用程序创建了三个固件。

Qt Widgets演示




固件大小:6.6 MB。
内存需求:3.4 MB。

正如我们所看到的,Qt Widgets运行得很好。

Qt Quick / QML演示




固件大小:9 MB。
内存需求:5 MB。

很容易看出,Qt QML的拖动动画在STM32F4 / F746上有点慢,但时钟工作得很好。这种行为是缺乏JIT编译的极好例子,因为这些MCU不支持双精度浮点。但是,STM32F769确实支持它,因此拖动动画在这块主板上看起来更漂亮。

电动自行车演示


我们决定不停止简单的演示,对于第三个固件,我们试图运行更有趣的事情。例如 - 我们最近的电动自行车演示。



固件大小:13 MB。
所需RAM:10 MB。

甚至这个演示也能正常工作。顺便说一下,得益于Qt的跨平台特性,我们不需要更改一行代码就可以对RTEMS进行编译(原始目标在Linux上运行)。

结论


我们可以得出结论,我们的研究是成功的。当然,它现在不是一个现成的解决方案,但是我们会继续努力。

目前的任务包括以下内容:

  • 移植更多的Qt模块,首先 - Qt for Automation插件库;

  • 进一步的端口优化和性能改进,例如利用由板提供的图形加速器,这是我们尚未使用的;

  • 进一步修改Qt配置系统(Qt Lite);

  • 将对MCU开发的支持添加到Qt Creator中。

那么,这项研究对你和你的项目意味着什么?QPA代码库中的新QPA和其他修改的源代码将在开放源代码(很可能在GPLv3下)中提供,当然也可以在商业许可证中提供,因此您可以自己尝试。

电子工程师时间点评:这个消息相信对很多嵌入式开发者来说是个非常好的消息,对Segger以及其他嵌入式GUI提供商来说可能是个坏消息,在中高端mcu上的GUI设计多了一家强大的竞争对手。


关注电子工程师时间,Get更多成长技能




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:电子工程师时间,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了