Kanzi アプリケーションを RCar Gen3/INTEGRITY にデプロイする¶
Kanzi アプリケーションを、INTEGRITYリアルタイムオペレーティングシステムを実行するM3やH3などのRenesas R-Car Gen 3プラットフォームにデプロイできます。
これらの手順は、Windows 10 および Ubuntu 18.04.5 LTS で検証されています。
前提条件¶
Kanzi アプリケーションをビルドおよびデプロイする前に、Renesas R-Car 用の動作する INTEGRITY 開発環境が必要です。これには以下が含まれます。
GHS MULTI IDE
INTEGRITYシステム開発キット
INTEGRITY AARCH コンパイラツールチェーン
ルネサス R-Car Gen 3 ボードサポートパッケージ
SCons と Python:
SCons 3.0.0 から 4.2.0 まで、Python 3.5 以降。
SCons 4.3.0以降、Python 3.6以降に対応しています。
アプリケーションをデプロイし、ファイルをターゲットデバイスに転送する手段として、TFTPサーバーを使用したU-bootやFAT形式のメモリーカード、またはGHS Probeなどがあります。
INTEGRITY開発環境のセットアップ方法については、/opt/sdk/ghs/int1178/manuals/devtree-arm64_rcar_notes.pdf で提供されているGreen Hills SoftwareのRenesas R-Car BSPユーザーズガイドを参照してください。
R-Car Gen 3ボードに Kanzi アプリケーションをデプロイする前に、GPUサポートパッケージに含まれるOpenGLの例の1つを正常にデプロイして実行できることを確認してください。
このトピックの例は、次のことを前提としています。
あなたの開発環境は
/opt/sdk/ghs/にインストールされています。ターゲットデバイスを構成して、U-bootブートローダーを使用してTFTPサーバーからバイナリイメージをロードするようにしました。
FAT形式のメモリーカードを使用して、Kanzi バイナリおよび設定ファイルをターゲットデバイスに転送します。
RCar-Gen3/INTEGRITY用の Kanzi アプリケーションの開発¶
Kanzi の開発ファイルを圧縮アーカイブとして受け取ります。アーカイブを <KanziWorkspace>/Engine ディレクトリに抽出します。
このパッケージには、kzb_player という最小限の例のプロジェクトが含まれています。このプロジェクトをテンプレートとして使用して、Kanzi アプリケーションを作成することができます。
RCar-Gen3/INTEGRITY用の Kanzi アプリケーションを開発する際は、Application::onConfigure の前にこれらのINTEGRITY固有の関数を呼び出す必要があることを念頭に置いてください。
kzs_file_base.hpp::kzsFileBaseSetResourceDirectory関数は、Kanzi にファイルシステム内の kzb ファイルの場所を伝えます。WaitForFileSystemInitialization()関数は、INTEGRITY の下でプロセスが並行して開始される方法に起因する競合状態を解決します。
INTEGRITYでのメモリマッピングファイル¶
INTEGRITYでは、Kanzi がファイルシステムからkzbファイルをロードし、メモリマッピングを使用してそれらにアクセスしようとします。
INTEGRITYについて、mmap():
デフォルトで、仮想アドレス空間にマップされるのは共有メモリオブジェクトのみです。
通常のファイルのマッピングをサポートしていません。
int<INTEGRITY_version>/manuals/libref.pdf ファイルの「インテグリティライブラリおよびユーティリティリファレンスガイド」を参照してください。
完全なPOSIX準拠の mmap() サポートには、Green Hills Softwareサポートからリクエストできる追加のライブラリが必要です。
Kanzi がファイルをマッピングできない場合、ファイル全体をメモリにコピーし、ログに Memory mapping failed. Reading the file to memory. を出力します。Kanzi がそのような警告をログに記録しない場合、メモリマッピングは期待通りに動作し、Kanzi はファイル全体をメモリにコピーしません。
ターゲットデバイスがファイル内容のPOSIXメモリマッピングをサポートしていない場合、メモリバッファからkzbファイルをロードすることができます。
メモリバッファからkzbファイルをロードするには:
Kanzi アプリケーションに、
registerKzbFromMemory関数を追加します。/// Registers in the Resource Manager a kzb file that resides in memory. /// Kanzi expects that a memory area registered this way is read-only /// and remains valid and unmodified throughout the lifetime of the process. /// \param bufferStart Pointer to the start of the kzb file. /// \param bufferSize Size of the kzb file in bytes. void registerKzbFromMemory(const byte* bufferStart, uintmax_t bufferSize) { // Load a file used for memory mapping. unique_ptr<File> file(new ReadOnlyMemoryFile(bufferStart, bufferSize)); unique_ptr<KzbFile> kzbFile(new KzbFile(getDomain(), kanzi::move(file))); string startupPrefab("kzb://" + kzbFile->getProjectName() + "/StartupPrefab"); // Pass the memory file to the Kanzi resource manager. getResourceManager()->addKzbFile(kanzi::move(kzbFile)); // Assign startup prefab for scene graph initialization. kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Setting startup prefab '{}'", startupPrefab)); m_startupPrefabUrl = startupPrefab; kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("onStartup [DONE]")); }
Application::onStartupコールバックで、registerKzbFromMemory関数を呼び出します。MULTIリンカーは、アドレススペースイメージにリンクされている各ファイルの開始位置とサイズに対して、グローバルに可視なシンボルを生成できます。これらのシンボルを使用して、ロードする各kzbファイルの開始位置とサイズを参照することができます。
// Symbols generated by MULTI Linker. //extern char __ghsbegin_kzbfile_a[]; // Start of first kzb file. //extern char __ghssize_kzbfile_a[]; // Size of first kzb file. //extern char __ghsbegin_kzbfile_b[]; // Start of second kzb file. //extern char __ghssize_kzbfile_b[]; // Size of second kzb file. // Override onStartup() callback. virtual void onStartup() KZ_OVERRIDE { registerKzbFromMemory(reinterpret_cast<byte*>(__ghsbegin_kzbfile_a), reinterpret_cast<size_t>(__ghssize_kzbfile_a)); registerKzbFromMemory(reinterpret_cast<byte*>(__ghsbegin_kzbfile_b), reinterpret_cast<size_t>(__ghssize_kzbfile_b)); }
Kanzi アプリケーションのコンパイル¶
Kanzi アプリケーションは、SCons または GHS MULTI のいずれかを使用してコンパイルできます。
kzb_player アプリケーションを使用して、Kanzi Studio で作成した kzb ファイルをロードして実行します。
SConsの使用¶
SConsでアプリケーションをコンパイルする際、ビルドシステムはターゲットプラットフォームに対してデフォルトのオプションを適用します。
例の Kanzi アプリケーションをコンパイルするためにSConsを使用するには:
(オプション) コンパイルプロセスは Kanzi Engine に依存します。プロジェクトを Kanzi ワークスペースディレクトリに保存し、プロジェクトがデフォルトの Kanzi プロジェクト構造を持っている場合、SCons は Kanzi Engine の場所を自動的に検出します。
Kanzi ワークスペースディレクトリにないディレクトリからプロジェクトをビルドするには、
KANZI_HOME環境変数を Kanzi ワークスペースパスに設定します。SCons はこの変数を使用して Kanzi Engine の場所を検出します。Windowsで、Kanzi Command Prompt からSConsを実行します。Kanzi Command Prompt は、
KANZI_HOME環境変数が設定された状態で実行されます。Kanzi Command Prompt を使用する を参照してください。コマンドラインで、ビルドしたいプロジェクトのターゲット構成ディレクトリに移動します。
例えば、
<KanziWorkspace>/Engine/applications/kzb_player/configs/platforms/integrity_rcar_rwm_aarch64に移動します。コマンドラインで、SCons を実行します。
スクリプトと構成ファイルには、ビルドタイプを選択するために使用できるカスタムコマンドライン引数が含まれています。
コマンド
ビルドタイプ (Build type)
sconsリリースビルドを作成します。
scons debugデバッグビルドを作成します。
scons profilingプロファイリングビルドを作成します。
ビルドが完了すると、
<KanziWorkspace>/Engine/Engine/applications/kzb_player/binディレクトリにアプリケーション実行可能ファイルkzb_player.binが見つかります。
GHS MULTIの使用¶
プラットフォーム固有の定義、コンパイラフラグ、およびライブラリ依存関係について学ぶには、<KanziWorkspace>/Engine/lib/integrity_rcar_rwm_aarch64/<BuildVariant>. のビルド情報XMLファイルを参照してください。
例の Kanzi アプリケーションをコンパイルするために GHS MULTI を使用するには:
KANZI_HOME環境変数を Kanzi ワークスペースパスに設定します。この方法で、GHS MULTIが Kanzi Engine の位置を検出できるようにします。
次の内容を
kzb_player.gpjファイルに追加し、そのファイルをGHS MULTIソリューションに追加して、プラットフォームの構成に合わせて編集してください。#!gbuild macro KZ_ENGINE_DIR=$(KANZI_HOME)/Engine macro KZ_ENGINE_PLATFORM_LIBS=$(KZ_ENGINE_DIR)/libraries/platforms/integrity_rcar_rwm_aarch64 #component integrity_virtual_address_space [Program] # Debug build #-G #-DKANZI_DEBUG #-L$(KZ_ENGINE_DIR)/lib/integrity_rcar_rwm_aarch64/ES3_Debug # Release build -DNDEBUG -L$(KZ_ENGINE_DIR)/lib/integrity_rcar_rwm_aarch64/ES3_Release # Defines -DKZ_SUPPORT_GRAPHICS_CONTEXT_API_EGL=1 -DKZ_SUPPORT_GRAPHICS_API_GLES=1 -DKZ_DLOAD_GLES_SYMBOLS=32 -DKZ_LINKED_GLES_SYMBOLS=31 -DKANZI_FEATURE_3D -DINTEGRITY -DPOSIX -DINT_178B -DBOOST_HAS_THREADS -DBOOST_HAS_PTHREADS -D__LITTLEENDIAN__ -DKZ_NULL_INPUT # Include paths # Kanzi Engine headers -I$(KZ_ENGINE_DIR)/include # Boost headers -I$(KZ_ENGINE_PLATFORM_LIBS)/boost/include -I$(KZ_ENGINE_DIR)/libraries/platforms/integrity/boost/include -I$(KZ_ENGINE_DIR)/libraries/common/boost/include # Khronos headers. Use only if they are not available in BSP. #-I$(KZ_ENGINE_DIR)/libraries/common/opengl_es_2_0/include # Kanzi Engine third-party dependencies. -I$(KZ_ENGINE_PLATFORM_LIBS)/freetype/include -I$(KZ_ENGINE_PLATFORM_LIBS)/harfbuzz/include -I$(KZ_ENGINE_PLATFORM_LIBS)/icu/include -I$(KZ_ENGINE_PLATFORM_LIBS)/libjpeg/include -I$(KZ_ENGINE_PLATFORM_LIBS)/libpng/include -I$(KZ_ENGINE_PLATFORM_LIBS)/libunibreak/include -I$(KZ_ENGINE_PLATFORM_LIBS)/zlib/include # Linker paths. -L$(KZ_ENGINE_PLATFORM_LIBS)/zlib/lib -L$(KZ_ENGINE_PLATFORM_LIBS)/freetype/lib -L$(KZ_ENGINE_PLATFORM_LIBS)/libjpeg/lib -L$(KZ_ENGINE_PLATFORM_LIBS)/libpng/lib -L$(KZ_ENGINE_PLATFORM_LIBS)/icu/lib -L$(KZ_ENGINE_PLATFORM_LIBS)/libunibreak/lib -L$(KZ_ENGINE_PLATFORM_LIBS)/harfbuzz/lib # Add BSP library paths as needed. # Compiler flags -os_dir ${__OS_DIR} -bsp devtree-arm64 --rtti --exceptions --link_once_templates --c++11 -language=cxx -fno-strict-aliasing --prototype_silent --display_error_number --diag_remark=1931,236,1934,1974,1,228,997 --diag_suppress 141 -Wno-shadow -dotciscxx -w -Wall --thread_local_storage # Release build optimization -O2 -Omax -Olink -Osize # System libraries -lposix -livfs -ldl -lstd # Add system libraries that you need. Note that Kanzi Engine requires Posix threads and pipe. # Kanzi Engine libraries -lkzappfw -lkzui -lkzcoreui -lkzcore # Kanzi Engine third-party dependencies -l$(KZ_ENGINE_PLATFORM_LIBS)/freetype/lib/libfreetype.a -l$(KZ_ENGINE_PLATFORM_LIBS)/harfbuzz/lib/libharfbuzz.a -l$(KZ_ENGINE_PLATFORM_LIBS)/icu/lib/libicuuc.a -l$(KZ_ENGINE_PLATFORM_LIBS)/icu/lib/libicui18n.a -l$(KZ_ENGINE_PLATFORM_LIBS)/icu/lib/libicudata.a -l$(KZ_ENGINE_PLATFORM_LIBS)/libjpeg/lib/libjpeg.a -l$(KZ_ENGINE_PLATFORM_LIBS)/libpng/lib/libpng.a -l$(KZ_ENGINE_PLATFORM_LIBS)/libunibreak/lib/libunibreak.a -l$(KZ_ENGINE_PLATFORM_LIBS)/zlib/lib/libz.aGHS MULTIで、アプリケーションとカーネルをコンパイルします。
gmemfileを使用して画像を準備します。これにより、kzb_player.binというファイルが生成されます。
Kanzi アプリケーションを U-boot でデプロイする¶
Kanzi アプリケーションを U-boot イメージとしてデプロイし、TFTP を使用してロードするには:
アプリケーションをバイナリイメージ
kzb_player.uimageの一部として実行可能にし、これらのファイルをメモリーカードにコピーし、ボードの電源を入れる前にカードをボードに挿入してください。kzb_player.binはアプリケーションの実行可能ファイルです。my_project.kzbは、Kanzi アプリケーションのコンテンツを含む kzb バイナリです。アプリケーションのプロジェクトから Kanzi Studio でkzbファイルをエクスポートします。Kanzi Studio プロジェクトに変更を加えた後は、毎回kzbバイナリをエクスポートしてください。kzbファイルの使用 を参照してください。
binaries.cfgには、アプリケーションの一部である kzb ファイルの名前が含まれています。application.cfgには、Kanzi アプリケーションを構成するために使用できるオプションのパラメーターが含まれています。アプリケーション構成リファレンス を参照してください。
Kanzi アプリケーションをU-bootイメージとしてデプロイし、TFTPを使用してロードするには、次を実行します。
tftp 48080000 kzb_player.uimage bootm 48080000
ヒント
これらのコマンドをデバイスの電源を入れたときに実行するには、U-Boot環境に保存してください。上記の例のデプロイメントアドレスは
48080000です。デプロイメントアドレスを見つけるには、ターゲットデバイスのドキュメントを参照してください。
GHS MULTIでのデバッグ¶
rtserv2プロトコルを使用してデバッガをアタッチできます。
GHS MULTIでデバッグするには:
GHS MULTI IDEで、Main > Connect > rtserv2 に移動します。
接続が確立されると、デバッガウィンドウが開きます。
kzb_player の下にある新しく作成された初期プロセスを選択し、緑色の矢印ボタンをクリックしてアプリケーションを開始します。
GHS MULTIでデバッグとリリースを切り替える¶
サンプル kzb_player.gpj はデフォルトでリリースビルドを作成しますが、デバッグビルドに切り替えるためのマクロが含まれています。
GHS MULTIでデバッグとリリースを切り替えるには:
_DEBUGプリプロセッサマクロを定義し、次の行をコメントアウトしてデバッグライブラリとリンクします:-G -DKANZI_DEBUG -L$(KZ_ENGINE_DIR)/lib/integrity_rcar_rwm_aarch64/ES3_Debug
_RELEASEマクロを定義する行をコメントアウトします。#-DNDEBUG #-G #-L$(KZ_ENGINE_DIR)/lib/integrity_rcar_rwm_aarch64/ES3_Release
アプリケーションを再コンパイルして再デプロイしてください。