C
アプリケーション・バックエンドの開発 (RH850)
このトピックでは、GHS MULTI IDEを使用してアプリケーションのバックエンドを作成および構築する手順を説明します。バックエンドは、アプリケーションのUIがプラットフォームと通信し、ハードウェアから必要な情報を取得できるようにします。この場合、デバイス・インターフェースはオンボード・ユーザー・ボタンのステータスを取得します。次の図は、2 つのコンポーネント間の相互作用を説明したものです:

エクスポート・アプリケーションとプラットフォーム・ソース
このセクションでは、Qt for MCUs ツールによってエクスポートされたアプリケーションとプラットフォーム ソースを含む QmlProject から GHS MULTI IDE プロジェクトを作成する手順を説明します。
- 次のコマンドでバッチ スクリプトを作成し、
qmlprojectexporterを呼び出して GHS マルチ IDE プロジェクトを生成します。set QUL_ROOT=C:\path\to\QtMCUs\2.12.0 set QMLPROJECT_FILE=C:\path\to\YourProject.qmlproject set BOARDDEFAULTS=%QUL_ROOT%\platform\boards\renesas\rh850-d1m1a-baremetal\cmake\BoardDefaults_32bpp.qmlprojectconfig set RGL_DIR=C:\path\to\rgl_ghs_D1Mx_obj_V2.2.0a set PROJECT_DIR=C:\path\to\PROJECT_DIR %QUL_ROOT%\bin\qmlprojectexporter.exe %QMLPROJECT_FILE% --platform=rh850-d1m1a-baremetal --toolchain=GHS --boarddefaults=%BOARDDEFAULTS% --outdir=%PROJECT_DIR% --project-type=ghs --include-ide-generated-hw-code --board-sdk=%RGL_DIR%
スクリプトを実行する前に、以下の変数が設定されていることを確認してください:
RGL_DIRをRenesas Graphics Library (RGL)2.2.0a のインストールパスに設定します、QUL_ROOTおよびQMLPROJECT_FILE.PROJECT_DIRをGHSプロジェクトファイルを配置する出力ディレクトリに設定します。
次に、コマンドプロンプトからスクリプトを実行して、以下を生成します:
- のQMLから生成されたC++ソース。
%PROJECT_DIR%/QtMCUs/generated - エクスポートされたプラットフォームソース
%PROJECT_DIR%/QtMCUs/platform %PROJECT_DIR%/GHSにあるサブプロジェクト・ファイルを含むトップレベル・プロジェクト・ファイル。
生成されたGHSプロジェクトには以下が含まれます:
%PROJECT_DIR%/GHS/project.gpj:トップレベルのプロジェクトファイル。%PROJECT_DIR%/GHS/prj/program.gpj:プログラムのコンパイル定義、インクルードディレクトリ、コンパイラとリンカのオプション。%PROJECT_DIR%/GHS/prj/drivers.gpj:RGLソースのリスト。%PROJECT_DIR%/GHS/prj/QtMCUs/qul_platform.gpj:RH850-D1M1Aプラットフォームのソースのリスト。%PROJECT_DIR%/GHS/prj/QtMCUs/qul_app.gpj:qmlprojectエクスポートから生成されたソースのリスト。%PROJECT_DIR%/GHS/prj/QtMCUs/qul_module_<ModuleName>.gpj:対応するQmlProjectモジュール用に生成されたソースを含む、各モジュール用の1つのサブプロジェクト。%PROJECT_DIR%/GHS/prj\application.gpj:次のセクションで編集するアプリケーション用の便宜的な空のサブプロジェクト。%PROJECT_DIR%/GHS/mcu_<YourProject>_qul_workspace.gmb:利便性のためにいくつかのコマンドが追加されたワークスペース。詳しくはGHS Multi IDE QUL Workspaceを参照してください。%PROJECT_DIR%/GHS/qul_probe_E1.con:E1プローブに接続するためのメタデータが含まれています。%PROJECT_DIR%/GHS/qul_probe_E2.con:E2 プローブに接続するためのメタデータが含まれています。
詳細については、プラットフォームソースを含むQt for MCUs プロジェクトのエクスポートを参照してください。
GHS MULTI IDEでアプリケーションをビルドする
次の手順では、アプリケーションのビルドに必要なGHSプロジェクトの適合手順を説明します:
- GHS MULTI Launcher (
mstart.exe) を起動します。 - File > Load Workspace from File... を選択し、前のセクションでエクスポートした %PROJECT_DIR%/GHS に移動します。ワークスペースファイル
mcu_<YourProject>_qul_workspace.gmbを選択します。 - ワークスペースのProject Manager エントリをダブルクリックして、プロジェクト・マネージャでプロジェクトを開きます。
- 任意のディレクトリに
main.cppという名前の新規ファイルを作成します。このディレクトリはBACKEND_DIR と呼ばれます:#include "YourProject.h" #include <qul/application.h> #include <qul/qul.h> int main() { Qul::initHardware(); Qul::initPlatform(); Qul::Application app; static YourProject item; app.setRootItem(&item); app.exec(); return 0; }
ここには、アプリケーションのデフォルトのエントリーポイントが含まれます。このエントリーポイントは、後でLEDとユーザー・ボタンを使用するための追加設定ステップで拡張します。詳細については、 Qt Quick Ultraliteをアプリケーションで実行するを参照してください。前の章で選択したのと同じプロジェクト名(YourProject )を使用するようにしてください。
application.gpjを選択したまま、または右クリックしてEdit を選択します。その内容を以下のように置き換えてください。#!gbuild macro APPLICATION_EXPORT_DIR=C:/path/to/PROJECT_DIR/QtMCUs/generated macro BACKEND_DIR=C:/path/to/BACKEND_DIR [Subproject] -DQUL_STD_STRING_SUPPORT -I${APPLICATION_EXPORT_DIR} # ----- backend ----- ${BACKEND_DIR}/main.cppAPPLICATION_EXPORT_DIRマクロを、エクスポートされた UI ソースがあるディレクトリに設定し、BACKEND_DIRマクロを、main.cppと以前に作成したバックエンド・ソースがあるディレクトリに設定してください。注:
.gpjプロジェクトファイルではインデントが重要です。ソースファイルを含む行の先頭に空白がないことを確認してください。詳細については、MULTI IDEのドキュメントを参照してください。- アプリケーション・バイナリ名はデフォルトで
application.elfです。別の名前を使用するには、program.gpjプロジェクトファイルの-o application.elfを-o YourProject.elfに変更します。 - この時点で、ここまでの手順が正しく行われていることを確認するために、部分的に実装したアプリケーショ ンをビルドしてRH850ボードにフラッシュし、ターゲット・ハードウェア上で実行することができま す。
フラッシュする前に、ボードがターゲットボードとコンピュータに接続されていることを確認してください。詳細については、 Renesas RH850とプローブの接続を参照してください。
接続が確立したら、GHS MULTI IDEを使用してアプリケーションをボードにフラッシュし、IDEの機能を使用してデバッグすることができます。
次のセクションでは、ユーザーボタンでUIとハードウェア間のインタラクションを可能にする低レベルロジックを追加します。
C++バックエンドの開発
次の手順では、アプリケーションの C++ バックエンドの開発プロセスを説明します:
- 新しい C++ ソースファイルとヘッダーファイルを作成し、それぞれ
deviceinterface.cppとdeviceinterface.hという名前にします。これらのファイルを先ほど作成したBACKEND_DIRディレクトリに保存します。 deviceinterface.hの内容を以下のように置き換える:#ifndef DEVICEINTERFACE_H #define DEVICEINTERFACE_H #include <qul/signal.h> #include <qul/singleton.h> #include <qul/eventqueue.h> typedef int HWButtonEvent; class DeviceInterface : public Qul::Singleton<DeviceInterface>, public Qul::EventQueue<HWButtonEvent> { public: Qul::Signal<void(int button)> buttonEvent; void onEvent(const HWButtonEvent &inputEvent); void toggleLED(); }; #endif //DEVICEINTERFACE_H
ヘッダーはQul::Singleton とQul::EventQueue を継承する
DeviceInterfaceクラスを宣言しています。また、buttonEventSignal とHWButtonEventイベント・タイプも宣言しています。これにより、シングルトン・オブジェクトのインスタンスをグローバルに利用できるようになります。C++とQMLの間のインターフェイスを提供し、HWButtonEvent入力イベントの受信時に変更されたシグナルを発信します。詳しくは、QMLにおけるシングルトンの定義と 割り込みハンドラからQMLへのデータ転送を参照してください。- 同様に、
deviceinterface.cppの内容を以下のように置き換えてください:#include "deviceinterface.h" #include "boardutils.h" void DeviceInterface::onEvent(const HWButtonEvent &inputEvent) { buttonEvent(inputEvent); } void DeviceInterface::toggleLED() { BoardUtils::toggleLED(); }
- 新しい C++ ソースファイルとヘッダーファイルのペアを作成し、それぞれを
boardutils.cppとboardutils.hと名付けます。これらのファイルをBACKEND_DIRディレクトリに保存します。 boardutils.hのコードを以下のように置き換える:#ifndef BOARDUTILS_H #define BOARDUTILS_H namespace BoardUtils { void configure(); void toggleLED(); } // namespace BoardUtils #endif //BOARDUTILS_H
BoardUtils::configure()とBoardUtils::toggleLED()の RH850-D1M1A 固有の実装をboardutils.cppに追加します:#include "boardutils.h" #include "deviceinterface.h" #include "r_typedefs.h" #include "r_bsp_hmi_api.h" #define LED_NR 0 #define LED_BRIGHTNESS_ON 100u #define LED_BRIGHTNESS_OFF 0u void button_handler() { DeviceInterface::instance().postEventFromInterrupt(0); } namespace BoardUtils { void configure() { R_BSP_HMI_Init(); R_BSP_SetButtonCallback(BSP_BTN_CENTER_PRESS, button_handler); R_BSP_HMI_SetLed(LED_NR, LED_BRIGHTNESS_OFF); } void toggleLED() { static bool isOff = true; R_BSP_HMI_SetLed(LED_NR, isOff ? LED_BRIGHTNESS_ON : LED_BRIGHTNESS_OFF); isOff = !isOff; } } // namespace BoardUtils
コンフィギュレーション関数は、ユーザーLEDとボタンのためにRGLライブラリからBSP固有の初期化関数を呼び出します。次に、
button_handler()をユーザー・ボタン・イベントの割り込み要求ハンドラとして登録します。割り込み要求ハンドラは、DeviceInterfaceSingleton オブジェクトを使用して、低レベルの割り込みイベントを QML コンテキストに伝搬します。- RH850のLEDとボタンを適切に設定するには、
main.cppを変更してboardutils.hヘッダをインクルードし、通常のプラットフォーム初期化の後にBoardUtils::configure()を呼び出すようにしてください:#include "boardutils.h" ... int main() { Qul::initHardware(); Qul::initPlatform(); BoardUtils::configure(); ... }
- 新しいソース・ファイルを
application.gpjに追加してください:#!gbuild ... # ----- backend ----- ${BACKEND_DIR}/main.cpp ${BACKEND_DIR}/boardutils.cpp ${BACKEND_DIR}/deviceinterface.cpp - 最後に、LEDとユーザー・ボタンの相互作用に必要なRGLライブラリ・ソースを
application.gpjに追加します:${QUL_BOARD_SDK_DIR}/vlib/bsp/board/d1mx_mango/src/hmi/r_bsp_hmi_knob.c${QUL_BOARD_SDK_DIR}/vlib/bsp/board/d1mx_mango/src/hmi/r_bsp_sys_hmi.c${QUL_BOARD_SDK_DIR}/vlib/bsp/hmi/src/r_bsp_hmi_main.c
Design StudioでUIとバックエンドを統合する
Qt Design Studio のDeviceInterfaceSingleton オブジェクトを使用して、前のセクションで実装した低レベルのバックエンド関数にアクセスします。
- Qt Design Studio でプロジェクトを開き、Connections ビューを選択します。
- Connections タブ
で
ボタンを選択し、新しい接続を追加します。
- 新しい接続を選択し、Connection パネル
を使用してCode ビューにジャンプします。
- Code ビューで、最初の接続
を追加し、statusRectをtargetとして、DeviceInterface.toggleLED()をonPressedChangedシグナルのアクションとして追加します。
- Code ビューで、2番目の接続
を追加し、DeviceInterfaceをtargetとして、statusRect.pressed = !statusRect.pressedをonButtonEventシグナルのアクションとして追加します。
これで、ボタンを押すと、イベントがQMLコンテキストに伝わり、
statusRect.pressedプロパティが変更されます。その結果、UIアイテムの色が変わります。statusRect.pressedプロパティの変更に応答して、DeviceInterface.toggleLED()メソッドが LED をトグルします。 - テキスト・エディターを使って
yourproject.qmlprojectを変更し、シングルトン・オブジェクトに必要な C++/QMLインターフェースを生成してください:InterfaceFiles { files: ["C:/path/to/BACKEND_DIR/deviceinterface.h"] }BACKEND_DIRパスを、
deviceinterface.hファイルを含むディレクトリに変更する。詳しくはQmlProjectInterfaceFilesを参照してください。
UIの変更後のGHSプロジェクトの更新
アプリケーションのUI部分に変更を加えたので、qmlprojectexporter を使用してUIソースを再度エクスポートします。
UI コードの新しい変更を既存の GHS プロジェクトに適用するには、--update-projectコマンドライン引数を使用します。以下のいずれかの方法を使用してください:
- GHS MULTI Launcherのワークスペースの
Sync Qmlproject files。UIでこのコマンドをダブルクリックして、プロジェクトファイルを更新します。 - 次のバッチ スクリプトを使用して手動で
qmlprojectexporterを呼び出します:set QUL_ROOT=C:\path\to\QtMCUs\2.12.0 set QMLPROJECT_FILE=C:\path\to\YourProject.qmlproject set PROJECT_DIR=C:\path\to\PROJECT_DIR set QMLPROJECT_DIR=%PROJECT_DIR%\QtMCUs\generated %QUL_ROOT%\bin\qmlprojectexporter.exe %QMLPROJECT_FILE% --update-project=%PROJECT_DIR%/GHS/project.gpj
これでアプリケーションの準備は完了です。GHS MULTIプロジェクトをビルドしてRH850ボードにフラッシュし、すべてが意図したとおりに動作することをテストします。次に、実験的に別のLEDのサポートを追加してみましょう。
特定の Qt ライセンスの下で利用可能です。
詳細をご覧ください。