C
native_simでのZephyr の使用
native_sim は、Zephyr のホストベースのシミュレーションボードです。このボード向けに構築されたアプリケーションは、MCUや命令セットのエミュレーションを必要とせず、ホストシステム上で直接実行されるLinux実行ファイルにコンパイルされます。ボード自体の詳細については、Zephyr のnative_simボードのドキュメントを参照してください。
native_sim-zephyr プラットフォームの移植版は、SDLウィンドウに画面を出力し、マウスポインタからタッチイベントを生成するため、ターゲットハードウェアがなくてもQt Quick Ultraliteアプリケーションを実行することが可能です。
対応バージョン
Qt Quick Ultralite Zephyr は、 上の 4.4.0をサポートしています。native_sim Zephyr
前提条件
- Qt Quick Ultralite 2.12.3
- Qt Quick Ultralite
native_simプラットフォームパッケージ - Linux (x86_64)
- GNU コンパイラコレクション
- Zephyr RTOS 4.4.0
- 64ビット SDL2 開発ライブラリ
注: native_sim でサポートされているホストはLinux のみです。
SDL2 開発ライブラリ
native_sim は、Zephyr の SDL ディスプレイおよび入力ドライバを通じて表示を制御し、ポインタ入力を読み取ります。そのため、Zephyr 4.4 以降では SDL2 が必須となります。
Qt Quick Ultraliteは64ビットボードターゲットnative_sim/native/64 をサポートしているため、64ビット版のSDL2開発ライブラリが必要です。ホストの依存関係に関する詳細については、Zephyr のnative_simボードのドキュメントを参照してください。
ディスプレイの設定
ディスプレイデバイスは、デバイスツリーzephyr,display で選択されたノードから解決されます。その解像度はディスプレイのランタイム機能から読み取られ、Qt Quick の Ultralite フレームバッファの割り当てに使用されます。このポートは単一の画面を提供します。
ポインタ入力は、Zephyr 入力サブシステムを介して同期モード(CONFIG_INPUT_MODE_SYNCHRONOUS )で提供されます。SDLウィンドウ内のマウスイベントは、Qt Quick Ultralite タッチイベントに変換されます。
画面サイズの設定
画面解像度は、デバイスツリー内のSDLディスプレイコントローラノードから取得され、デフォルトは320x240です。これを変更するには、app/boards/native_sim_native_64.overlay にボードのデバイスツリーオーバーレイを追加し、sdl_dc ノードのwidth およびheight プロパティを設定します。
&sdl_dc {
width = <800>;
height = <480>;
};Zephyr native_sim/native/64 向けにビルドする際、このオーバーレイが自動的に読み込まれます。
ピクセル形式
native_sim-zephyr プラットフォームポートは、24 ビットの色深度でレンダリングされます。
メモリ構成
UI ツリー、画像バッファ、フォントデータなどのQt Quick Ultralite における動的割り当ては、CONFIG_HEAP_MEM_POOL_SIZE でサイズが指定されたZephyr カーネルヒープから提供されます。
一方、ディスプレイのフレームバッファは、Zephyr の共通Cライブラリヒープから割り当てられるため、Qt Quick Ultralite によるメモリ消費量の測定対象には含まれません。native_sim-zephyr のデフォルト設定では、そのヒープ(CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE )とカーネルヒープの両方が10240000バイトに設定されており、さまざまな画面解像度に対応しています。
アプリケーションのビルド
アプリケーションの設定およびビルドに関する一般的な手順については、「新しいアプリケーションの設定」、「QUL_ROOTの設定」、および「ビルド」を参照してください。
native_sim/native/64 用のアプリケーションをビルドするには、以下を実行してください:
west build -b native_sim/native/64 app
必要な Kconfig オプション
native_sim-zephyr プラットフォームポートには、Qt Quick Ultraliteに必要なKconfig設定が記載されたqul_module.conf ファイルが同梱されています。これは、Kconfigが実行される前にEXTRA_CONF_FILE を通じて適用されます。
代わりにアプリケーション側から設定を指定するには、CONFIG_QUL_DEFAULT_CONF=n を設定し、ポートのqul_module.conf にあるオプションをアプリケーションのprj.conf に追加します:
$HOME/Qt/QtMCUs/2.12.3/platform/boards/zephyr/native_sim-zephyr/qul_module.conf
Qt Quick Ultralite ライブラリのビルド
デフォルトでは、Qt Quick Ultralite はインストール時に含まれる事前ビルド済みのライブラリを使用します。これらは、native_sim 向けのRelease 設定でビルドされたものです。独自のライブラリをビルドするには、次のコマンドを実行します:
west build-qul-libs --board native_sim/native/64 --build-type Release
コマンドラインオプションの完全な一覧については、「 Qt Quick Ultralite ライブラリのビルド」を参照してください。
アプリケーションスレッド
native_sim では、Qt Quick Ultralite スレッドがまだ実行中の状態で表示ウィンドウを閉じると、Zephyr がposix_exit() を呼び出します。これにより、Qul::Application が破棄される前に静的に割り当てられた項目の割り当てが解除され、クラッシュにつながる可能性があります。以下のQt Quick Ultralite スレッドのコードは、Qul::Application が破棄される前にダングリングポインタが残らないようにします:
#include "MainScreen.h" #include <qul/application.h> #include <qul/qul.h> #include <zephyr/kernel.h> #include <memory> #include <new> #define QUL_THREAD_STACK_SIZE 16384 #define QUL_THREAD_PRIORITY 5 static void qul_thread_entry(void *, void *, void *) { Qul::initHardware(); Qul::initPlatform(); static unsigned char storage[sizeof(MainScreen)]; std::unique_ptr<MainScreen, void (*)(MainScreen *)> item( new (storage) MainScreen, [](MainScreen *p) { p->~MainScreen(); }); Qul::Application app; app.setRootItem(item.get()); app.exec(); } K_THREAD_DEFINE(qul_tid, QUL_THREAD_STACK_SIZE, qul_thread_entry, NULL, NULL, NULL, QUL_THREAD_PRIORITY, 0, 0);
K_THREAD_DEFINE 起動時にZephyr スレッドを作成します。このスレッドのエントリポイントは、Qt Quick Ultralite イベントループを開始する前に、ハードウェアとプラットフォームを初期化します。
ルートアイテムは、static ストレージへの placement new を使用して構築されるため、静的 RAM として扱われます。これは、デストラクタのみを呼び出すデリータを持つstd::unique_ptr によって所有されます。std::unique_ptr はQul::Application の前に宣言されているため、スレッドスタックがアンワインドされた場合、アプリケーションはルートアイテムよりも先に破棄されます。
注: MainScreen は 、Qt Quick UltraliteアプリケーションのメインQMLファイルがMainScreen.qml であることを前提としています。アプリケーションのメインQMLファイル名に合わせて、アイテム名を変更してください。
アプリケーションの実行
ビルドにより、ホスト実行ファイルが生成されます。west を通じて実行します:
west build -t run
あるいは、ビルドディレクトリから実行ファイルを直接実行することもできます:
./build/zephyr/zephyr.exe
実行ファイルが起動すると、アプリケーションの表示と入力を行うためのSDLウィンドウが開きます。
既知の問題と制限事項
- この移植版はハードウェアレイヤーをサポートしていません。プラットフォームに渡されたレイヤー引数はすべて無視されます。
特定のQtライセンスの下で利用可能です。
詳細はこちらをご覧ください。