マイクロコントローラー(MCU)で Qt

Published Monday September 3rd, 2018
Leave a comment
Posted in Qt | Tags: , , , ,

この記事は The Qt BlogQt on Microcontrollers (MCU) を翻訳したものです。
執筆: Mikhail Svetkin, 2018年05月03日

Qt をマイクロコントーラー(MCU)でのソフトウェア開発に使うことができないか、オペレーティングシステムなしに(“bare metail”) Qt を動かすことができないかという声をよく耳にします。本日は、いくつかの動作デモをお見せしながらこれらの質問に回答したいと思います。

なぜマイクロコントローラーなのか?

MCU とは単一の集積回路で動作する小さなコンピューターです。性能は劣りますが、システムオンチップ(SoC) とよく似ています。マイクロコントローラーは、車のエンジン制御や埋め込み型の医療機器、ウェアブル、リモコン、OA機器、家電、工具類、おもちゃやその他の組み込みシステムのような自動制御機器でよく利用されています。MCU を採用する利点はサイズの小ささと特にボリュームの大きい製品ではコストがとても低いことです。

MCU はその定義が示すように、サイズが小さく、消費電力が低く、単価が安いという特徴があります。というわけで、MCU を採用する一番の理由は、コストの削減ということが言えるでしょう。

なぜ Qt を MCU で使いたいの?

スペックの低さはソフトウェア開発の選択肢に制限をもたらします。GUI が伴う場合はそれが顕著で、ファームウェアのサイズやランタイムのメモリ消費量、GUI の美しさなどの問題が起こりえます。

MCU 向けの GUI の解は現在はありません。もちろん、特定の MCU 向けの特定の問題に対するソリューションはいくつかありますが、まだまだ不十分です。また、そういうライブラリが「クロスプラットフォーム的に」なっている事は稀(現実にはない)です。

いくつかの有料のツールキットは良くできていますが、ほとんどがソースコードが公開されていません。つまり、みなさんは「ブラックボックス」を購入することで、ベンダーロックのリスクを抱えます。

ここで、Qt が使えたらどれほど素晴らしいか想像してみましょう。クロスプラットフォームの(GUI を含む)豊富なクラスライブラリで、素晴らしいドキュメントやサンプルも揃っていて、素晴らしいオープンソースのコミュニティも存在します。

残念ながら現時点では前述のハードウェアの制限により、組み込みでの Qt(Qt for Device Creation) が 公式に対応しているもの は Cortex-A 相当で、Linux や商用の RTOS(INTEGRITY や QNX、VxWorks) のみとなっています。

しかし、この状況は変わりつつあります。

リサーチ

やってみよう

まず自分たちで手を動かして、MCU で Qt を動かすための可能性を探ってみます。

12 Mhz CPU と 128 byte RAM のような MCU を想像して夢を膨らませないよう、ここで対象としているマイクロコントローラーを明確にしておきます。以下の Qt の 現在のハードウェアの制限 とは大きなギャップがあるでしょう。

  • 256 MB の RAM
  • 500 MHz の CPU (1 GHz 推奨)
  • OpenGL ES 2.0 対応

これらは明らかに、小さなフットプリントしか持たないマイクロコントローラーのレベルではありません。

今回のリサーチに選んだボードは以下のとおりです:

STM32F469STM32F469 – ARM Cortex-M4, 単精度の浮動小数点ユニット

STM32F746STM32F746 – ARM Cortex-M7, 単精度の浮動小数点ユニット, L1 キャッシュ(データ/インストラクション)

STM32F769STM32F769 – ARM Cortex-M7, 倍精度の浮動小数点ユニット, L1 キャッシュ(データ/インストラクション)

スペックのとおり、これらのハードウェアのリソースは Qt が「公式に」要求しているものよりはとても低いものです。

OpenGL については、CPU での描画を提供する Qt Quick 2D Renderer により、現在では厳密には要求ではなくなっています。

私たちは以下の Qt のモジュールのポーティングからはじめました:

ポーティング

Qt を異なるプラットフォームにポーティングをするにはどうしたらいいでしょう?まずは、Qt が機能するために何が必要かを理解する必要があります。そして、以下の2つが主な必要条件となります。

  • POSIX 互換の OS
  • C++11 対応のコンパイラ

C++11 の方からはじめましょう。Qt 5.7 以降、強力で最新の C++ のフレームワークを提供するため、C++11 をサポートするプラットフォームが必須となりました。しかし、どう頑張っても C++98 の対応しかできない場合は、Qt 5.6(以前) が選択肢としてはありますが、(Qt Lite と呼ばれる) 新しいビルドの設定ツール が導入されたのが Qt 5.8 ということもあり、Qt を MCU 環境向けに絞りきる作業のハードルはグッとあがるでしょう。

次は POSIX – Portable Operating System Interface です。これが実は Qt が “bare metal” ではそのまま動かないという件の回答となります。Qt の内部では多くの POSIX 関数(pthreads, mmap, fopen, open など)を使用しているため、もし bare metal 上で Qt を動かそうと思ったら、自分でその OS に対応した POSIX の実装をする必要があります。ラッキーなことに、今回のリサーチではこれは問題になりません。

今回は、オープンソースの RTOS の RTEMS を使うことにしました。主な機能は以下のとおり:

  • シンプルさ
  • POSIX 対応
  • NFS や FAT を含む様々なファイルシステムに対応
  • FreeBSD 由来の TCP/IP スタックを提供
  • C++11 対応
  • オープンソースライセンス(修正 GPL)
  • アクティブなコミュニティ

Qt の RTEMS へのポーティングは以下のステップで行われます:

  • ボードの設定 – クロックジェネレーター(frequency) の設定、メモリ(SDRAM, キャッシュ, MPU)、周辺機器の初期化など
  • RTEMS の STEM32F4/F7 への移植 (BSP の作成)
  • Qt の RTEMS への移植
    • Qt Core の RTEMS 対応
    • QPA プラグインの開発

Qt 自体の移植は以下の図で示されます:

porting-qt

今回のリサーチのもっとも興味深いところではありますが、すべてのプロセスの詳細(ボードの設定から QPA の開発)はここでは記載しません。今回の記事は、リサーチの紹介であり、ステップバイステップのマニュアルを提供することではありません。このパイロットプロジェクトに興味がある方は、私たちにお知らせください

結果

今回のリサーチ結果をお見せするため、それぞれのボード向けに3つの異なるデモアプリのファームウェアを作成しました。

Qt Widgets のデモ

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

ご覧のとおり、Qt Widgets は問題なく動作しています。

Qt Quick / QML のデモ

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

Qt QML のドラッグ時のアニメーションは、 STM32F4/F746 では若干鈍いですが、時計の針は問題なく動いています。これは JIT コンパイルに対応していないためで、これらの MCU には倍精度の浮動小数点のサポートがありません。しかし、STM32F769 ではこれがサポートされていて、ドラッグが他のボードに比べてとてもスムーズになっています。

電子バイクのデモ

3つ目のデモは、シンプルものではなく、面白いものを選ぶことにしました。例えば、我々の e-bike demo です。

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

このデモはとてもよく動いています。ところで、Qt はクロスプラットフォームなので、(元々 Linux で動作することを想定していた)アプリのコードは一行も変えること無く RTEMS でもコンパイルをすることができました。

結論

今回のリサーチは大成功だったと結論付けることができるでしょう。当然、完璧なソリューションには現時点では程遠いですが、今後改善していく予定です。

現時点での作業項目:

  • より多くの Qt のモジュールの移植、初めは Qt for Automation アドオンのライブラリから
  • 移植の最適化とパフォーマンスの改善。例えば、現時点では共通化されていない、グラフィックスのアクセラレーターの利用を可能にする方法など
  • Qt の設定システム(Qt Lite) をさらに改善する
  • Qt Creator の MCU 上での開発の対応を追加

さて、今回のリサーチはいかがでしたか?今回作成した QPA や Qt に対する変更はオープンソース(おそらく GPLv3)と商用のライセンスで公開される予定です。まもなく、ご自身で試す事ができるようになるでしょう。

みなさんの MCU のプラットフォームに Qt を移植しシステムイメージを作成するためのコンサルティングサービスも提供する予定です。今後もさらなる情報を提供していきますのでお楽しみに!

Do you like this? Share it
Share on LinkedInGoogle+Share on FacebookTweet about this on Twitter

Posted in Qt | Tags: , , , ,

Leave a Reply

Your email address will not be published.

Get started today with Qt Download now