热度 9
2021-12-24 11:58
1480 次阅读|
0 个评论
B y Toradex 秦海 1). 简介 对于初次使用 Torizon 的客户,可能会需要将现有的项目工程导入到 Torizon 开发环境,本文就基于一个中等规模的开源项目来演示如何借助 Torizon Virtual Studio Code Extension 来将其导入到 Torizon ,并进行编译和部署。 本文所选择的是一个基于 autotools 编译框架的中等规模的项目,基本上符合大多数嵌入式应用的规模,通过整个流程演示来提供相关的思路和解决导入中遇到问题的线索,当然由于实际应用的不同以及所采用比如 Makefiles 、 Cmake 等其他编译框架,不能完全保证所有的导入都是按照文章所演示的流程,甚至是否一定能够导入成功也肯定不是完全确定,但是大的思路是可以参考借鉴的。 2 ) . 准备 a). Apalis iMX8 ARM 核心版配合 Ixora 载板 ,连接调试串口 UART1 (载板 X2 2 )到开发主机方便调试 , 连接 HDMI 显示器用于显示。 b ). Ubuntu 18.04 64bit 开发主机,参考 这里 说明配置好 Docker 环境。请注意在每次重启电脑后,都要执行一次下面命令来提供 ARM emulation 环境。 - --------------------------------------------------------------------------- $ docker run --rm -it --privileged torizon/binfmt - --------------------------------------------------------------------------- c ). 参考 这里 的说明配置好 Virtual Studio Code 并安装好 Torizon Extension 。 d ). 参考 这里 的说明使用 VS Code 配合 Torizon Extension ,编译测试一个 Hello world 的 C/C++ 应用来验证整个开发和部署环境工作正常。 3) . 导入 C/C++ 项目 a). 本次测试所使用的开源项目 Fuse 从如下 github 地址下载,项目是一个跨平台的针对 1980 年代流行的 Sinclair ZX Spectrum 8bit 个人键盘式电脑的模拟器。项目于基于 C 语言开发并拥有一个基于 Gtk 开发的用户界面,虽然 Debian 已经提供了现成的 Fuse 安装包,但是本文主要演示导入项目源码并进行编译和部署的流程。 - --------------------------------------------------------------------------- ### download fuse-emulator-fuse source code $ git clone https://git.code.sf.net/p/fuse-emulator/fuse fuse-emulator-fuse ### download libspectrum library source code $ cd fuse-emulator-fuse $ git clone https://git.code.sf.net/p/fuse-emulator/libspectrum fuse-emulator-libspectrum ---------------------------------------------------------------------------- b). 通过 VS Code Torizon Extension 将上面下载的 fuse-emulator-fuse 项目导入 ./ 在 VS Code 执行 ” Torizon: Import an existing C/C++ application” 命令 ---------------------------------------------------------------------------- - Open the fuse base source folder (fuse-emulator-fuse) - Define the application name (fuse) - Select autotools-based project as the project type - Select “ Wayland arm64v8-vivante bullseye “ platform ( as we use apalis imx8 which is 64 -bit) - Select user as torizon (default) - Select debug configuration - Provide the relative path (bin/fuse) where main executable binary will be installed into. ---------------------------------------------------------------------------- c ). 然后 Torizon extension 会根据上面配置信息自动创建一个编译容器,重新加载 VS Code 并通过 Microsoft 的 Remote-containers extension 来在创建的编译容器中运行导入的项目 d). 创建完成后 Output 输出会给出如下 Error ,这个在当前这个阶段是正常的,后面修改配置文件会解决。 - --------------------------------------------------------------------------- checking for LIBSPECTRUM... no configure: error: in `/workspaces/fuse-emulator-fuse': configure: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBSPECTRUM_CFLAGS and LIBSPECTRUM_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See `config.log' for more details The terminal process terminated with exit code: 1 - --------------------------------------------------------------------------- 4 ). 添加编译依赖库 a). 通常你可以通过查询项目源码提供的 README 和 INSTALL 等文件查询到项目编译所需要的依赖库,但有时候也可能不那么明确,就需要直接查询源码文件,或者只能通过 ” 测试 - 失败 - 修改 - 测试 ” 的循环来找出所需要的依赖库。 b). 然后,添加的依赖库要对应所需要编译的平台和版本,比如本文测试的平台是 arm64 环境,版本是 Debian bullseye 。通常可以通过在 Package.debian.org 上面查询相关的库,也可以参考 这里 说明直接在模块上面交互模式运行一个基础 Debian bullseye 容器,并在容器内通过 ”apt-cache search” 命令查询所需要的库。 c). fuse 项目所需要的依赖库参考如下添加,添加完成后 VS Code 会自动弹出窗口询问是否重新编译 SDK 并添加新的库,选择是进行重新编译。 - --------------------------------------------------------------------------- - Select Torizon icon in the Visual Studio Code activity bar. - Go to the CONFIGURATION panel. - Set the property “devpackages” to: libglib2.0-dev:arm64 libaudiofile-dev:arm64 libgtk-3-dev:arm64 bison flex - --------------------------------------------------------------------------- 5 ). 修改项目 Build Tasks a). 项目 Build Tasks 由 VS Code 项目文件管理器中的 “.vscode/tasks.json” 文件中定义,包含 configure/build 等任务的定义,并通过 autotools 生成真正的 makefile 用于编译。 b). 由于 fuse 项目编译所需要的 libspectrum 库需要先于 fuse 项目本身进行编译并生成 binary 库文件被调用,因此这里需要对应修改 tasks.json 文件以适配,而如果你的项目不包含这样的库,则无需这个步骤。 c). 首先添加如下内容到 tasks.json 文件增加 libspectrum 库的 configure 和 build 子任务 - --------------------------------------------------------------------------- { "label": "autoreconf_libspectrum", "command": "autoreconf", "type": "shell", "args": , "options": { "cwd": "${workspaceFolder}/fuse-emulator-libspectrum" }, "problemMatcher": , "options": { "cwd": "${workspaceFolder}/fuse-emulator-libspectrum" }, "problemMatcher": }, { "label": "build_libspectrum", "command": "make", "type": "shell", "args": , "problemMatcher": { "base": "$gcc" }, "options": { "cwd": "${workspaceFolder}/fuse-emulator-libspectrum", "env": { "CFLAGS": "-g", "CXXFLAGS": "-g" } }, "group": "build", "dependsOn": }, - --------------------------------------------------------------------------- d). 然后修改 tasks.json 文件中 fuse 主应用本身 configure/build 配置增加 libspectrum 库的编译任务,同时还需要配置 pkgconfig 环境变量以便于从 libspectrum 编译目录找到对应的 .pc 描述文件。 - --------------------------------------------------------------------------- { "label": "configure_debug", "command": "./configure", "type": "shell", "args": , "problemMatcher": }, { "label": "configure_release", "command": "./configure", "type": "shell", "args": , "problemMatcher": }, - --------------------------------------------------------------------------- e). 最后修改 tasks.json 文件的 deploy 任务,新增 libspectrum 库的 deploy 子任务,以及 fuse 主应用 deploy 任务中增加 libspectrum 库。 - --------------------------------------------------------------------------- { "detail": "deploy application to work folder", "label": "deploy", "command": "make", "args": , "type": "shell", "options": { "env": { "DESTDIR": "${workspaceFolder}/${config:torizon.appfolder}/work" } }, "group": "none", "dependsOn": }, { "detail": "deploy libspectrum to work folder", "label": "deploy_libspectrum", "command": "install", "args": , "type": "shell", "group": "none" } - --------------------------------------------------------------------------- f). 最终完整的 tasks.json 文件可以参考 这里 ,保存所有修改后,执行 ”” 命令重新加载,然后执行 ” Tasks:Run Build Task ” 任务,此时就可以将 fuse 项目完整编译成功。 6 ). 增加 Runtime 库支持 a). 如下增加 runtime 库支持,使得应用部署后可以正常运行 - --------------------------------------------------------------------------- - Select Torizon icon in the Visual Studio Code activity bar. - Go to the CONFIGURATION panel. - Set the property “extrapackages” to: glib2.0 libaudiofile1 libgtk-3-0 - --------------------------------------------------------------------------- 7 ). 增加应用 Wayland Socket 和 Audio 设备的访问权限 a). 为了显示应用界面,一个 Wayland compositor 也会在设备上同步下载启动,为了和 Wayland compositor 交互,需要增加位于 /tmp 的 Wayland socket 访问权限,更多关于添加 volumes 和 bind-mount 的说明可以参考 这里 。 - --------------------------------------------------------------------------- - Select Torizon icon in the Visual Studio Code activity bar. - Go to the CONFIGURATION panel. - P ress the + button near “volumes” - I nsert “/tmp” as the key value, press Enter to confirm - I nsert “/tmp” also as value, press enter to confirm - --------------------------------------------------------------------------- b ). 应用需要访问设备 OSS 音频设备来运行,如下在应用 container 中增加所需音频设备的访问权限 - --------------------------------------------------------------------------- - Select Torizon icon in the Visual Studio Code activity bar. - Go to the CONFIGURATION panel. - P ress the + button near “ devices ” - I nsert the device path “ /dev/ dsp ”, press Enter to confirm - --------------------------------------------------------------------------- 8 ). 设置 Shared Libraries Path 环境变量 a). libspectrum 库会被部署到 fuse 应用目录的 /lib 子目录,因此需要增加如下环境变量指定相关路径。更多关于环境变量的说明请参考 这里 。 b). 参考 这里 说明修改 config 文件添加开机画面图片 - --------------------------------------------------------------------------- - Select Torizon icon in the Visual Studio Code activity bar. - Go to the CONFIGURATION panel. - Set the property “ env ” to: ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/#%application.appname%#/lib" - --------------------------------------------------------------------------- 9 ). Update MIME Database a). 由于一个 Gtk 相关的问题,在 Debug 应用时候,需要运行 ” update-mime-database ” 工具来加载应用图标,因此我们可以通过如下设置在配置好的 container 环境中运行相关命令 - --------------------------------------------------------------------------- - Select Torizon icon in the Visual Studio Code activity bar. - Go to the CONFIGURATION panel. - Set the property “buildcommands” to: RUN update-mime-database /usr/share/mime - --------------------------------------------------------------------------- 10 ). 通过 Ycoto 定制 TorizonCore 镜像 a). 由于默认的 TorizonCore 系统只有 Alsa 音频的支持,并未提供 OSS 音频的支持,因此我们需要通过 Ycoto 重新编译 TorizonCore 镜像来增加 OSS 音频支持,以便 fuse 应用在设备上面运行 b). 首先参考 这里 的说明下载适用于 Apalis iMX8 的 TorizonCore v5.4.0 版本对应的 Linux Kernel 源代码,参考 这里 进行编译配置。 c). 如下修改 Kernel configuration ,增加 Alsa OSS Emulation 驱动。修改后重新编译生成 ” .config ” 配置文件,并重命名为 ” defconfig ” 文件以备后续使用。 - --------------------------------------------------------------------------- Advanced Linux Sound Architecture Enable OSS Emulation OSS Mixer API OSS PCM (digital audio) API OSS PCM (digital audio) API - Include plugin system - --------------------------------------------------------------------------- d). 参考这里配置 Torizon Ycoto 编译环境,增加如下文件以适配修改的 Kernel configuration 。 ./ 创建 “linux-toradex_5.4-2.3.x.bbappend” 文件,指定修改的 ” defconfig ” Kernel configuration 文件 - --------------------------------------------------------------------------- $ cd /layers/meta-toradex-torizon/recipes-kernel/linux $ vi linux-toradex_5.4-2.3.x.bbappend FILESEXTRAPATHS_prepend := "${THISDIR}/files:" SRC_URI_append = " \ file://defconfig \ " - --------------------------------------------------------------------------- ./ 创建 ” files ” 目录,将上一步生成好的 ” defconfig ” 文件复制到这里 - --------------------------------------------------------------------------- $ mkdir files $ cp .../defconfig files - --------------------------------------------------------------------------- e). 重新编译生成 TorizonCore 镜像,然后参考 这里 的说明安装到 Apalis iMX8 模块上面。 - --------------------------------------------------------------------------- $ bitbake torizon-core-docker - --------------------------------------------------------------------------- 11 ). 在设备上面部署运行 Fuse 应用 a). 参考 这里 说明在 VS Code 中连接更新好 TorizonCore 镜像的 Apalis iMX8 模块。系统启动后,通过调试串口执行下面命令加载 PCM_OSS 驱动 - --------------------------------------------------------------------------- $ sudo modprobe snd-pcm-oss $ ls /dev/dsp* /dev/dsp /dev/dsp1 /dev/dsp2 - --------------------------------------------------------------------------- b). 此时基于上述步骤 5 以及编译好的 Fuse 项目,接下来就可以进行 Debug 或者 Deploy c). 输入 ” F5 ” 即可以开始 Debug , Torizon Extension 会自动完整生成 debug container 并部署到模块运行进入 Debug 模式状态,按需要设置断点既可以进一步调试了。 d). 调试完成后,也可以通过下面命令将 Fuse 应用 Deploy 到设备上面并运行应用 - --------------------------------------------------------------------------- ### compile release container ### - Command “ Torizon: Build release container for the application ” ### deploy release container ### - Command “ Torizon: Deploy release container ” ### run release container ### - Command “ Torizon: Run/restart release container ” - --------------------------------------------------------------------------- 运行效果 12) . 总结 本文演示了基于 NXP iMX8 ARM 处理器将现有 C/C++ 导入到 Torizon 的一个示例供参考,具体不同项目所需要的流程和遇到的问题可能会不同,但解决问题的思路可以参考借鉴。 参考文档 https://developer.toradex.cn/knowledge-base/torizon-cc-application-importing-example