将 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 的函数:
kzs_file_base.hpp::kzsFileBaseSetResourceDirectory函数告诉 Kanzi kzb 文件在文件系统中的位置。WaitForFileSystemInitialization()函数解决了在 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 文件:
在您的 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 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 应用程序:
(可选) 编译过程依赖于 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。
脚本和配置文件包括自定义命令行参数,您可以使用这些参数来选择构建类型。
命令
构建类型
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 应用程序:
将
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.a在 GHS MULTI 中,编译应用程序和内核。
使用
gmemfile准备图像。这将生成一个名为kzb_player.bin的文件。
使用 U-boot 部署您的 Kanzi 应用程序¶
要将您的 Kanzi 应用程序作为 U-boot 映像部署并使用 TFTP 加载:
将应用程序可执行文件作为二进制映像
kzb_player.uimage的一部分,复制这些文件到存储卡中,并在启动电路板之前将卡插入电路板中:要将您的 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) 和发布 (release):
通过注释掉来定义
_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
重新编译并重新部署应用程序。