将 Kanzi 应用程序部署到 RCar Gen3/INTEGRITY。

您可以将您的 Kanzi 应用程序部署到运行 INTEGRITY 实时操作系统的瑞萨 R-Car Gen 3 平台,例如 M3 或 H3。

这些说明已在 Windows 10 和 Ubuntu 18.04.5 LTS 上验证。

前提条件

在您可以构建和部署 Kanzi 应用程序之前,您需要一个适用于 Renesas R-Car 的有效 INTEGRITY 开发环境,包括:

  • GHS MULTI IDE

  • INTEGRITY 系统开发工具包

  • INTEGRITY AARCH 编译器工具链

  • Renesas R-Car Gen 3 板支持包

  • SCons 和 Python:

    • 对于 SCons 3.0.0 到 4.2.0,Python 3.5 或更新版本。

    • 对于 SCons 4.3.0 或更新版本,Python 3.6 或更新版本。

  • 将应用程序部署并将文件传输到目标设备的方法,例如使用 TFTP 服务器和 FAT 格式化内存卡的 U-boot,或 GHS Probe。

有关如何建立 INTEGRITY 开发环境的信息,请参阅 Green Hills 软件在 /opt/sdk/ghs/int1178/manuals/devtree-arm64_rcar_notes.pdf 提供的《Renesas R-Car BSP 用户指南》。

在开始将 Kanzi 应用程序部署到 R-Car Gen 3 板之前,确保可以成功部署并运行 GPU 支持包中提供的 OpenGL 示例之一。

本主题中的示例假设:

  • 您的开发环境安装在 /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 的函数:

在 INTEGRITY 上进行内存映射文件。

在 INTEGRITY 上,Kanzi 从文件系统加载 kzb 文件,并尝试使用内存映射访问它们。

在 INTEGRITY 上,mmap():

  • 默认情况下,仅将共享内存对象映射到虚拟地址空间。

  • 不支持映射常规文件。

请参阅 int<INTEGRITY_version>/manuals/libref.pdf 文件中的 Integrity Libraries and Utilities Reference Guide。

完整的符合 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 Linker 可以为链接到您的地址空间映像的每个文件生成全局可见的符号,表示其起始位置和大小。您可以使用这些符号来引用您加载的每个 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 应用程序

您可以使用 SCons 或 GHS MULTI 编译您的 Kanzi 应用程序。

使用 kzb_player 应用程序加载并运行您在 Kanzi Studio 中创建的 kzb 文件。

使用 SCons

当您使用 SCons 编译应用程序时,构建系统会应用目标平台的默认选项。

要使用 SCons 编译示例 Kanzi 应用程序:

  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。

    脚本和配置文件包括自定义命令行参数,您可以使用这些参数来选择构建类型。

    命令

    构建类型

    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 文件。

要使用 GHS MULTI 编译示例 Kanzi 应用程序:

  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 的文件。

使用 U-boot 部署您的 Kanzi 应用程序

要将您的 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 中切换调试 (debug) 和发布 (release):

  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 文件