Richard Lin

在单片机(MCU)上运行Qt

Published 星期三 八月 15th, 2018
7 Comments on 在单片机(MCU)上运行Qt
Posted in qt-blogs-chinese, qt-labs-chinese, qt-quarterly-chinese, qtearth-blogs-chinese | Tags: , , , ,

本文翻译自:Qt on Microcontrollers (MCU)

原文作者:Mikhail Svetkin

翻译审校:York Chen

经常有人问我们能否在单片机(MCU)上运行Qt,以及Qt能否不依赖操作系统运行(裸跑)。本文将尝试回答这些问题,并展示几个较有说服力的案例。

为什么要使用单片机?

单片机是集成在电路板上的微型计算机。它们与片上系统(SoC)有点类似,但是没有那么复杂。单片机在自动化控制产品和设备上非常常见,如汽车发动机控制系统、植入式医疗设备、可穿戴设备、电动工具、玩具以及其他各种嵌入式系统。单片机的主要优点是它们小巧的体积以及低廉的价格,对于大批量生成而言这些优势尤为明显。

从定义就可以看出单片机的主要特性:体积小,功耗低以及随之而来的低成本。因此,我们可以认为使用单片机的最主要目的是节省费用。

为什么要在单片机上使用Qt?

低运算能力的应用场景肯定会限制开发工具的选择,特别是涉及到图形界面(GUI)的问题。比如,必须要考虑固件大小,运行时的内存大小以及图形界面可能要做多“花哨”。

到目前为止,单片机还没有一个通用的图形界面库。当然,对于某些特定型号的单片机,有一些库可以部分解决类似问题,但远未完善。而且它们中,几乎不具备跨平台的能力。

尽管有些商业工具非常棒,但是它们基本上都是闭源的。您只能买到一个“黑盒子”,而且还有供应商锁定的风险。

这样说来,如果我们能用上Qt框架,还是非常激动人心的一件事:跨平台特性、五花八门包罗万象的类库(包括图形界面)、丰富的例程以及给力的开源社区。

不幸的是,由于之前提到的硬件限制,目前Qt嵌入式开发(Qt for Device Creation官方只支持Cortex-A及同等水平的硬件,大多基于Linux操作系统或其他商业实时操作系统(INTEGRITY,QNX和VxWorks)

但是现在,情况已经发生了变化。

立项

我们立项研究在单片机平台上运行Qt的可能性。

让我们先说明一下选用的单片机型号,因为有人可能已经联想到那些12MHz CPU和128bytes RAM的单片机了。那个差距实在是太大了,Qt现在的硬件要求是:

  • 256 MB 的RAM;
  • 500 MHz CPU (推荐1 GHz);
  • 支持OpenGL ES 2.0.

这肯定不是单片机的水平,因为单片机的硬件配置低得多。

在这个研发项目里,我们选用的开发板是:

STM32F469

STM32F469 – ARM Cortex-M4, FPU unit single precision

STM32F746 – ARM Cortex-M7, FPU unit single precision, L1 Cache (Data/Instruction)

STM32F769 – ARM Cortex-M7, FPU unit double precision, L1 Cache (Data/Instruction)

您能从以上规格说明中看到,它们的硬件配置比Qt“官方”要求低得多。

关于支持OpenGL,有了Qt Quick 2D Renderer,这不再是必备选项,因为我们可以使用栅格绘图引擎渲染画面。

我们移植了如下Qt模块:

Qt Widgets;

Qt QML;

Qt Quick Controls 2;

移植

怎样才能把Qt移植到不同的目标平台呢?首先,我们需要了解Qt运行的确切要求。总的来说,有两个必要条件:

  • 兼容POSIX的操作系统
  • 兼容C++11的编译器

首先来看C++11的要求。从5.7版本开始,Qt要求系统支持C++11,因为我们要提供的是一个强大的现代化的C++框架。然而,如果您的平台最高只能支持C++98,那么您当然可以使用Qt5.6或更早的版本。但您会需要考虑另一个问题,新的裁剪系统(称为Qt Lite)是从Qt5.8版本才加入,在此版本之前要把Qt压缩到MCU平台上会非常艰难。

接下来看POSIX,即Portable Operating System Interface。Qt内部使用了大量的POSIX接口函数(pthreadsmmap、fopen、open等等),这就是为什么Qt不能直接在板子上“裸跑”。但是如果我们还是想直接运行Qt,那就要自己实现POSIX接口,即实现自己的操作系统。所幸,我们的项目不需要考虑这一问题。

我们决定使用一个开源实时操作系统(RTOS),最终选择了RTEMS,因为它具备以下显著的特性:

  • 简单
  • 支持POSIX接口
  • 支持各种文件系统,包括NFS和FAT
  • 包含部分FreeBSD TCP/IP协议栈
  • 支持C++11
  • 使用开源协议(GPL的改版)
  • 有活跃的社区

把Qt移植到RTEMS包含了以下几步:

  • 配置板卡 —— 设置时钟发生器(频率),内存(SDRAM,caches,MPU),初始化周边等;
  • 把RTEMS移植到STM32F4/F7(创建BSP);
  • Qt移植到RTEMS:-  Qt Core中增加RTEMS的支持;-  创建一个新的QPA插件。

移植Qt本身表述如下:

我们无法在此详细描述完整过程(从配置开发板到创建新的QPA),尽管这可能是研发过程中最有意思的部分。但是本文主要目的仅仅是概述项目,而不是提供一个操作手册。如果您对如何执行试验项目有兴趣,请 联系我们,并提交您的需求。

效果

为了展示效果,我们为每个开发板创建了一套固件,包含了不同的demo应用。

1

Qt Widgets demo

2

Firmware size: 6.6 MB.
RAM required: 3.4 MB.

如您所见,Qt Widgets运行良好。

Qt Quick / QML demo

3

Firmware size: 9 MB.
RAM required: 5 MB.

显而易见,Qt QML的拖动效果虽然在STM32F4/F746上有些缓慢,但是时钟工作正常。这恰好例证了缺少JIT编译的影响,因为那些MCU不支持双精度浮点数。而STM32F769支持该特性,因此在该平台上拖动效果有明显改善。

E-bike 演示

我们决定在第三套固件上不再使用简单的demo,我们尝试运行一些更有意思的东西。例如最新的e-bike演示

4

Firmware size: 13 MB.
RAM required: 10 MB.

这个演示竟然也运行良好。顺便提一句,多亏了Qt自带的跨平台特性,我们没有改任何一行代码,就把它编译到了RTEMS系统上(原来是在Linux上运行)。

结论

我们认为我们的研究项目取得了成功。当然,目前它还不是一个开箱即用的方案,但我们会继续完善。

当前任务包含:

  • 移植更多的Qt模块,首先要做的是Qt for Automation扩展包
  • 更多的移植优化和性能提升。例如,要充分利用开发板提供的图形加速能力,这点我们还没有使用;
  • 深度改进Qt配置系统(Qt Lite);
  • 在Qt Creator中增加单片机开发的支持。

那么,这项研发对于您和您的项目有什么意义吗?新的QPA插件和其他Qt源代码的修改都将开源(最可能使用GPLv3协议),当然也会在商业版中发布,因此您可以自己试一试。

我们计划提供咨询服务,包含准备系统镜像以及把Qt移植到您的单片机平台。关于这点将会有更多消息发布,敬请关注!

Posted in qt-blogs-chinese, qt-labs-chinese, qt-quarterly-chinese, qtearth-blogs-chinese | Tags: , , , ,

7 comments

Jack Chen 说道:

关于这方面的信息请一直发往我的邮箱! 一个长期使用Qt的人

near2see 说道:

您好哪里能获取到详细资料呢,有没有镜像资源呢?

Richard Lin Richard Lin 说道:

Qt for MCU不是一个开箱即用的技术,请联系我们获得更多支持。

永远的百分百 说道:

very good,stm32f4 demo? 3 you,English pool

roy pan 说道:

Cool

说道:

您好,我这有一块f769的开发版,想尝试一下现在的环境,哪里可以获取到?

Richard Lin Richard Lin 说道:

Qt on MCU目前是纯商业版本,需要Qt的专业服务团队的定制优化。如果大家有兴趣可以联系我们,Qt可以提供免费的demo和测试数据。

发表评论

电子邮件地址不会被公开。

Get started today with Qt Download now