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ファイルをロードするには:

  1. 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]"));
    }
    
  2. 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を使用するには:

  1. (オプション) コンパイルプロセスは 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 を使用する を参照してください。

  2. コマンドラインで、ビルドしたいプロジェクトのターゲット構成ディレクトリに移動します。

    例えば、<KanziWorkspace>/Engine/applications/kzb_player/configs/platforms/integrity_rcar_rwm_aarch64 に移動します。

  3. コマンドラインで、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 を使用するには:

  1. KANZI_HOME 環境変数を Kanzi ワークスペースパスに設定します。

    この方法で、GHS MULTIが Kanzi Engine の位置を検出できるようにします。

  2. 次の内容を 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.a
    
  3. GHS MULTIで、アプリケーションとカーネルをコンパイルします。

  4. gmemfile を使用して画像を準備します。これにより、kzb_player.bin というファイルが生成されます。

Kanzi アプリケーションを U-boot でデプロイする

Kanzi アプリケーションを U-boot イメージとしてデプロイし、TFTP を使用してロードするには:

  1. アプリケーションをバイナリイメージ kzb_player.uimage の一部として実行可能にし、これらのファイルをメモリーカードにコピーし、ボードの電源を入れる前にカードをボードに挿入してください。

    • kzb_player.bin はアプリケーションの実行可能ファイルです。

    • my_project.kzb は、Kanzi アプリケーションのコンテンツを含む kzb バイナリです。

      アプリケーションのプロジェクトから Kanzi Studio でkzbファイルをエクスポートします。Kanzi Studio プロジェクトに変更を加えた後は、毎回kzbバイナリをエクスポートしてください。kzbファイルの使用 を参照してください。

    • binaries.cfg には、アプリケーションの一部である kzb ファイルの名前が含まれています。

    • application.cfg には、Kanzi アプリケーションを構成するために使用できるオプションのパラメーターが含まれています。アプリケーション構成リファレンス を参照してください。

  2. Kanzi アプリケーションをU-bootイメージとしてデプロイし、TFTPを使用してロードするには、次を実行します。

    tftp 48080000 kzb_player.uimage
    bootm 48080000
    

    ヒント

    これらのコマンドをデバイスの電源を入れたときに実行するには、U-Boot環境に保存してください。上記の例のデプロイメントアドレスは 48080000 です。デプロイメントアドレスを見つけるには、ターゲットデバイスのドキュメントを参照してください。

GHS MULTIでのデバッグ

rtserv2プロトコルを使用してデバッガをアタッチできます。

GHS MULTIでデバッグするには:

  1. GHS MULTI IDEで、Main > Connect > rtserv2 に移動します。

    接続が確立されると、デバッガウィンドウが開きます。

  2. kzb_player の下にある新しく作成された初期プロセスを選択し、緑色の矢印ボタンをクリックしてアプリケーションを開始します。

GHS MULTIでデバッグとリリースを切り替える

サンプル kzb_player.gpj はデフォルトでリリースビルドを作成しますが、デバッグビルドに切り替えるためのマクロが含まれています。

GHS MULTIでデバッグとリリースを切り替えるには:

  1. _DEBUG プリプロセッサマクロを定義し、次の行をコメントアウトしてデバッグライブラリとリンクします:

    -G
    -DKANZI_DEBUG
    -L$(KZ_ENGINE_DIR)/lib/integrity_rcar_rwm_aarch64/ES3_Debug
    
  2. _RELEASE マクロを定義する行をコメントアウトします。

    #-DNDEBUG
    #-G
    #-L$(KZ_ENGINE_DIR)/lib/integrity_rcar_rwm_aarch64/ES3_Release
    
  3. アプリケーションを再コンパイルして再デプロイしてください。

関連項目

Kanzi アプリケーションのデプロイ

kzbファイルの使用