tag 标签: vscode

相关帖子
相关博文
  • 热度 2
    2023-11-4 08:03
    507 次阅读|
    0 个评论
    在Linux中,Cmake能够很容易地配置OpenCV,主要是因为Cmake是一个跨平台的构建工具,可以生成适用于各种操作系统和编译器的构建脚本。使用Cmake编译OpenCV源码可以确保在不同平台上都能够正确配置和构建库。无论是在Windows、Linux还是Mac等操作系统上,使用Cmake都可以提供一致性和可移植性。 然而,配置VSCode或设置各种环境变量并不一定能够直接解决这个问题,因为它们并不直接涉及到OpenCV的编译过程。VSCode只是一个代码编辑器,它需要使用已经编译好的OpenCV库文件,而不是直接参与编译过程。而环境变量通常只用于指定编译和运行时的一些参数和路径,例如编译器路径、库文件路径等,但并不直接决定OpenCV的编译过程。 在配置VSCode或设置环境变量时,可能需要考虑的是如何将这些变量和参数正确地设置到你的开发环境中,以便在编译和运行OpenCV程序时能够正确地找到相关的库文件和依赖项。这可能需要一些额外的配置步骤,例如在VSCode中设置正确的编译器路径、在环境变量中添加正确的库文件路径等。 综上所述,Cmake能够很容易地配置OpenCV是因为它能够自动检测和配置OpenCV的依赖项,生成适用于不同平台的构建脚本。而配置VSCode或设置环境变量需要一些额外的步骤,以确保你的开发环境能够正确地找到编译和运行OpenCV程序所需的库文件和依赖项。
  • 热度 8
    2022-12-12 18:43
    910 次阅读|
    0 个评论
    IAR Systems更新Visual Studio Code扩展
    用于代码构建和调试的 IAR Visual Studio Code 扩展备受市场喜爱,其最新 1.20 版进一步简化了嵌入式开发工作流程 嵌入式开发软件和服务的全球领导者 IAR Systems 为使用 Visual Studio Code (VS Code) 的嵌入式开发人员提供进一步支持,最新的 IAR Build 和 IAR C-SPY 调试的 VS Code 扩展 1.20 版与所有最新版本的 IAR Embedded Workbench 兼容,包括对称多核调试,支持更高级的断点类型,以及可定制的构建工具栏。这些新功能将进一步帮助软件工程师优化工作流程、提高性能,并降低开发成本,使用者可通过 Visual Studio Code Marketplace 免费下载。 VS Code 是一个流行的代码编辑器,被嵌入式开发人员用来有效地构建和调试复杂的项目、任务运行、版本控制等众多任务。通过 IAR 的 VS Code 扩展,开发人员可以在 VS Code 中处理代码,并充分利用 IAR Embedded Workbench 的强大功能,包括 IAR C-SPY 调试 和 IAR 构建工具。 IAR 工具会自动检测并支持 Arm 、 RISC-V 、 Renesas RH850 和 RL78 、 AVR 、 8051 等各种版本。 IAR C-SPY 是一个用于嵌入式应用的高级调试器,已完全集成到 IAR Embedded Workbench 中,可在同一个 IDE 中提供开发和调试功能。 IAR VS Code C-SPY 调试扩展自动提供来自工具套件和项目的调试配置。该扩展支持 Arm 和 RISC-V ,在 1.20 版本中还支持 Microchip AVR 和 Renesas RL78 芯片。此外,最新版本的扩展提供了对称多核调试和使用 Visual Studio 的高级断点类型,如条件断点、数据断点和日志断点(日志消息)。 最新版本的 IAR Build VS Code 扩展新增了一个工具栏窗口,其中包含用于构建应用和执行 C-STAT 静态分析的按钮。在 “ 扩展配置 ” 视图中新增了一个下拉菜单,允许开发人员选择 IAR Embedded Workbench 中的 “ 自定义参数变量 ” 。为了将工作区中不必要的项目文件从项目列表中排除,还增加 “ Projects to Exclude ” 设置。此外,现在设置文件中的文件路径使用的是工作区的相对路径,而不是绝对路径。 IAR Build 和 IAR C-SPY 调试扩展所实现的可扩展跨平台开发工作流程,为软件工程师提供了所有的功能和有用的快捷方式,帮助他们轻松管理项目文件,并保持对他们应用中每一行代码和每一条指令的控制。为了满足开发要求, VS Code 扩展还可以用于其他构建系统,如 Cmake 、源代码控制和 GitHub 等版本扩展以满足开发需求。 IAR Systems 的首席技术官 Anders Holmberg 表示: “ 今年早些时候, IAR 在 GitHub 和 Marketplace 上推出第一个官方 Visual Studio Code 扩展,在 Visual Studio Code 社区的下载使用率超出了我们的预期。这反映了嵌入式行业中一种趋势,即混合搭配各种技术,提高效率、实现更多自动化、支持各种跨平台环境。我们后续也听取了来自用户和市场的直接反馈,在此次 IAR VS Code 扩展新版本中相应添加了更多功能,提升用户体验。 ” 如需下载 IAR Build 和 IAR C-SPY 调试的 VS Code 扩展,可以直接访问 VS Code 的 Marketplace 或 IAR 的 GitHub 页面 https://github.com/IARSystems/iar-vsc-build 和 https://github.com/IARSystems/iar-vsc-debug 。如需了解有关 IAR Visual Studio Code 扩展的更多信息,请访问 www.iar.com/vscode 。 编者注: IAR Systems 、 IAR Embedded Workbench 、 Embedded Trust 、 C-Trust 、 C-SPY 、 C-RUN 、 C-STAT 、 IAR Visual State 、 I-jet 、 I-jet Trace 、 IAR Academy 、 IAR 以及 IAR Systems 的标识均是 IAR Systems AB 拥有的商标或注册商标。所有其他产品名称均为其各自所有者的商标。 关于 IAR Systems IAR Systems 提供世界领先的软件和服务,帮助提高开发人员在嵌入式开发和嵌入式安全方面的生产力,使企业能够创造和保护当前的产品和未来的创新。目前, IAR Systems 为来自 200 多个半导体合作伙伴的 15000 款芯片提供支持,为大约 10 万名供职于福布斯 2000 强公司、中小企业和初创企业的开发人员提供服务。 IAR Systems 成立于 1983 年,总部设在瑞典乌普萨拉,有 220 多名员工,在亚太地区、欧洲、中东和非洲以及北美设有 14 个办事处。 IAR Systems 为 I.A.R. Systems Group AB 所有,在纳斯达克 OMX 斯德哥尔摩交易所上市,属于中型股指数(股票代码: IAR B )。
  • 热度 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
  • 热度 3
    2021-12-14 15:13
    1696 次阅读|
    0 个评论
    B y Toradex 胡珊逢 Torizon 是一种基于容器形式开发应用的操作系统。这不仅是指用户的应用在容器里面运行,应用的编译和调试也是需要借助容器。为了便于用户开发, Toradex 推出的 V isual Studio Code/ V isual Studio T orizon Extension 能够完成后台的容器配置,便于用户使用。本文将介绍 T orizon Extension 后台实现的流程,从而帮助用户更好地调试应用程序。 总体来讲,开发语言可以分为两类,一种需要编译后在目标设备上运行,例如 C/ C++ 、 Qt 等 ,另外一种是可以直接解释运行,如 Python 。这里我们以需要编译的开发语言 C /C++ 为例进行说明。对于传统的嵌入式 L inux C /C++ 应用开发,首先要在开发电脑上安装交叉编译工具或者包含交叉编译工具的 SDK ,然后编写应用代码,用编译工具进行交叉编译,最后把编译好的二进制文件部署到目标设备上进行调试,常见的工具如 GDB 。 Torizon 的总体流程也是如此,但最大的区别是交叉编译工具的安装、编译和调试并不需要用户手动运行相关指令,而是 T orizon Extension 会在开发电脑上自动创建一个 SDK 容器,里面包含所需的交叉编译工具和头文件等,用户的代码在容器里面进行编译并通过 GDB 调试。由于采用的是容器形式,因此 Torizon 的开发电脑可以是 L inux ,也可以是 Windows 系统, Windows 需要安装 WSL 。 构建 SDK 容器 当用户在 V isual Studio Code/ V isual Studio 上安装了 T orizon Extension 之后,总体情况如下。在开发电脑和计算机模块上都将运行 Docker 。 T orizon Extension 会根据用户代码类型,如 C / C++ 、 . Net 自动生成合适的 SDK 容器。用户代码文件通过 T orizon Extension 在 SDK 容器中使用合适的编译工具进行编译。然后 T orizon Extension 再生成一个可以部署到计算机模块上运行的 release 或者 debug 版本容器。对于 debug 版本容器, T orizon Extension 通过 SDK 容器对其进行调试,如使用 GDB 工具。 下面我们将使用 V isual Studio Code 创建一个单 C 文件的 Hello World 工程,完成编译、调试和部署流程,并介绍这背后 T orizon Extension 是如何生成 SDK 容器、目标设备的 release / debug 版本容器以及如何执行编译、调试和部署任务。 首先在 V isual Studio Code 中创建一个 C/C++ 项目,选择 arm64v8-debian-no-ssh_bullseys 平台。 创建完毕后,点击 V isual Studio Code 中 Terminal → New Terminal , 点击右边 Torizon IDE backend process 标签 。在这个终端中会输出 SDK 容器构建时后台日志。 当 SDK 容器构建成功后,可以在开发电脑的终端上输入下面命令,查看正在运行的容器。 -------------------------------------- $ docker container ls -------------------------------------- 这里名为 keen_yalow 即为 Torizon Extension 生成的 SDK 容器。使用下面命令进入 SDK 容器,在容器的 /workspaces/HelloWorld 位置可以看到 Hello World 项目文件,包括 C 文件等。 -------------------------------------- $ docker exec -it keen_yalow bash root@dell-5400:/# cd /workspaces/HelloWorld/ root@dell-5400:/workspaces/HelloWorld# ls HelloWorld.c appconfig_0 -------------------------------------- 除了开发电脑的终端里使用 docker 命令进入 SDK 容器外,还可以在 Visual Studio Code 中 Terminal → New Terminal 新建一个 bash 终端直接进入 SDK 容器,同样也可以看到项目文件。 这些项目文件同样也位于 Visual Studio Code 的文件浏览器中,用户可以直接对其进行修改。 在开发电脑的终端中使用下面命令,看到 SDK 容器中 /workspaces/HelloWorld 目录实际上 bind 到开发电脑上创建项目时选择的保存目录。 -------------------------------------- $ docker inspect keen_yalow -------------------------------------- 回到 Visual Studio Code 中打开的终端中,可以看到 S DK 容器中已经安装了 aarch64-linux-gnu-gcc 等交叉编译工具。这是 Torizon Extension 在创建 SDK 容器时自动安装的工具。用户无需手动安装。 那么 Torizon Extension 是如何构建该 SDK 容器呢?得益于 Torizon Extension 的开源 ,我们可以一窥其中究竟。在一开始使用 V isual Studio Code 创建一个 C/C++ 项目,我们选择了 arm64v8-debian-no-ssh_bullseys 平台, T orizon Extension 则使用 对应的模板文件 。其中的 sdk.dockerfile 就是用于生成 SDK 容器的 docker file 文件,以及 config.yaml 配置文件。 sdk.dockerfile 中的 FROM #%platform.sdkbaseimage%# 指定 SDK 容器构建的基础容器镜像, sdkbaseimage 的配置位于 config.yaml 文件,即使用 torizon/debian:2-bullseye 。 -------------------------------------- baseimage: common: - "torizon/debian" - "2-bullseye" -------------------------------------- 然后通过 apt-get 命令继续安装其他调试所需的软件,如 gdb-multiarch 等。在 sdk.dockerfile 中还有一些其他参数,如 #%application.sdkpreinstallcommands%# ,这就允许用户使用 dockerfile 文件编写语法在构建 SDK 容器时能够添加其他的软件和第三方库文件,甚至修改 SDK 容器本身的配置,如 更改 de bian 下载源 。这些具体的参数可以参考 这里 。当然用户并不需要直接修改这里的配置文件,在 V isual Studio Code 的 T orizon Extension 插件中可以十分方便地进行更改。 至此,我们已经阐释了 T orizon Extension 是如果构建 SDK 容器。用到的工具大致和传统嵌入式 L inux 开发类似,只是这操作都由 T orizon Extension 在容器内完成,并为用户提供灵活的配置功能。上述过程总体如下图。 接下我们将看看编译是如何完成的。 应用程序编译 点击 Ter build_debug 即开始编译 Debug 版本的应用编译。编译的时候在 V isual Studio Code 可以看到下面输出日志。 在 SDK 容器中实际上执行了 aarch64-linux-gnu-gcc -g HelloWorld.c -o HelloWord 命令对 C 进行编译。本文创建项目是选了单个 C 文件的项目类型,所以编译时仅使用 HelloWorld.c 。 进入 SDK 容器的 /workspaces/HelloWorld 目录,我们可以看到编译生成的二进制可执行文件 HelloWorld 。它是针对 ARM aa rch64 处理器进行交叉编译的。 之所以能够完成上述编译任务,是由于在创建项目时, Torizon Extension 自动生成了 V isual Studio Code 配置文件 tasks.json 。这里定义了 build_debug 任务具体执行的命令参数。用户因此只需要像上面提到的步骤,点击 build_debug 即可开始编译。 编译总体过程如下图。 完成编译后,接下来就是开始调试。 应用程序调试 在编译完成后点击 F 5 开始调试用于程序。在 Torizon 上应用是以容器形式运行的,调试过程实际上将应用打包成一个可以在目标设备上运行的容器,并在容器里面启动调试工具。所以在按 F5 之后, Torizon Extension 会开始构建一个包含应用的新容器。 当容器构建完毕并部署到目标设备后在 V isual Studio Code 会进入单步调试界面。 此时我们查看设备上的的镜像 Images 和容器 Containers 会发现一个 debug 版本的 helloworld 镜像和一个正在运行的 debug 版本的 helloworld 容器。这些就是刚才按 F 5 开始调试时, Torizon Extension 自动部署过来的。 目标设备上的容器和开发电脑上的 SDK 容器之间通过 gdb 实现调试功能。使用 SSH 登录目标设备,运行下面命令查看正在运行的容器信息。 -------------------------------------- $ docker container ls -------------------------------------- 目标设备上 0.0.0.0 :3 2768 映射到容器内部的 6502 端口。 查看容器 ID 并进入容器。通过 ps 命令列出容器中所有运行的进程。这里可以看到有个 gdbserver 进程正在运行并监听 6502 端口。通过该进程,连接开发电脑上 SDK 容器中的 gdb 客户端从而实现 Visual Studio Code 的调试功能。 同样在开发电脑查看 SDK 容器内运行的进程,其中另一个是 gdb-multiarch 就是 gdb 客户端。 那么现在我们将揭示 Tor izon Extension 是如何为目标设备构建 debug 版本容器,以及在 VS Code 中是如何启动调试任务的。我们回到 Tor izon Extension 的开源项目中的 arm64v8-debian-no-ssh_bullseye 模板。其中 debug.dockerfile 就是用于生成 debug 版本容器的文件。 首先, FROM --platform=#%platform.architecture%# #%platform.baseimage%# 指定了 debug 版本容器使用的基础镜像,对应在 config.yaml 中配置属性参数。 EXPOSE 6502 指定 gbdserver 监听端口。接下来 apt -get 命令安装 gdbserver 。这期间还可以通过 #%application.extrapackages%# 来安装第三方软件和库文件,这些具体的参数可以参考 这里 。最后设置 debug 版本容器启动时运行的命令, CMD stdbuf -oL -eL gdbserver 0.0.0.0:6502 /#%application.appname%#/#%application.exename%# #%application.appargs%# 。这里看到启动 gdbserver ,并可以接收执行应用程序的参数。最终通过该容器即可在目标设备上启动一个 debug 版本容器,并在容器内使用 gdbserver 与 VS C ode 连接,调试用户应用程序。 仔细的你可能发现, debug.dockerfile 中并没有将编译好的应用二进制文件包含进来。使用 SSH 登录目标设备,运行下面命令查看正在运行的容器的详细信息。 ec85215a7553 为正在运行的 debug 版本容器 ID 。 -------------------------------------- $ docker container inspect ec85215a7553 -------------------------------------- Torizon 系统的 /home/torizon/HelloWorld 目录被映射到 debug 版本容器的 /HelloWorld 目录。 T orizon Extensio n 通过 rsync 将开发电脑上编译好的二进制文件 HelloWorld 复制到目标设备上默认用户 toriozn 的用户目录下 /home/torizon/HelloWorld 。因此在上面的截图中我们能够看到 debug 版本容器中 gdbserver 其指向的应用路径位于 /HelloWorld/HelloWorld 。之所以不将二进制应用直接放入容器的原因是,在调试期间用户应用代码可能会经常做修改,采用这样的方式只需要重新编译应用代码本身,而不必重新构建和部署整个 debug 版本容器。重新编译生成的二进制文件可以重新映射到原来的容器,这样的设计能够极大提高了调试效率。 在 Visual Studio Code 上按 F 5 启动调试时,该任务是在 launch.json 文件中配置的。这里指定 g db 作为调试器,具体为 gdbmultiarch 。详细说明可以参考 VS Code Configuring C/C++ debugging 。 调试总体过程如下。 最终应用部署 当完成应用调试后,通常生成一个 release 版本最终发布容器。在上面的 debug 版本容器虽然已经包含了用户开发的应用,但也包含了 gdbserver 等额外的工具,并且应用通过 gdbserver 启动。这样的容器显然不适合用于最终的发布。因此我们需要在 VS Code 依次点击 Torizon: Deploy release container 生成一个包含用户应用的最终发布版本容器。 进行上面步骤前,在 Torizon Extension 插件中我们先删除之前已经部署和运行的 de bug 版本镜像和容器。 然后完成上述构建并部署 发布版本容器。在开发电脑的终端上使用 docker images 可以查看到生成的发布版本容器。相比于 debug 版本容器,由于不再安装部分软件,因此发布版本容器体积也会小一些。 部署完毕后,在目标设备上也可以看到这个 发布版本容器。 如果你已经看到这里,恭喜,你已经了解 Torizon Extension 后台运行的大部分过程。现在只剩下发布版本容器是如何构建的。这部分则相对简单些。继续回到 Tor izon Extension 的开源项目中的 arm64v8-debian-no-ssh_bullseye 模板。其中 release.dockerfile 就是用于生成发布版本容器的文件。发布版本容器使用的基础镜像和 debug 版本一样, FROM --platform=#%platform.architecture%# #%platform.baseimage%# ,但不再使用 apt-get 安装 gdbserver 等工具。用户指定的第三方软件和库通过 "#%application.extrapackages%#" 仍可以安装。 COPY work/#%application.appname%# /#%application.appname%# 将之前编译好的二进制应用文件复制到容器中。最后设置容器启动时运行的命令 CMD /#%application.appname%#/#%application.exename%# #%application.appargs%# 。这里我们看到发布版本容器已经不再像 debug.dockerfile 使用 gdbserver 启动应用,而是直接执行用户的应用。这是发布版本容器和 debug 版本容器最大的不同。 当通过 VS Code 运行发布版本容器后,在 Torizon Extension 界面中可以看到该容器相关信息。由于演示代码中执行完 printf 函数后程序会直接退出,因此这里看到的容器是停止状态。在下方容器信息窗口中,默认运行的程序是 /HelloWorld/HelloWorld ,即上通过 release.dockerfile 生成容器时所添加的二进制文件。 构建和部署发布版本容器总体过程如下。 总结 Torizon Extension 简化了在嵌入式系统上使用容器进行应用开发,在代码编写、调试、部署各个阶段都提供了丰富的功能,采用容器形式的开发方式也有别于传统嵌入式 L inux ,希望通过本文的介绍能够使您了解 Torizon Extension 背后的任务流程,从而更好地使用 Torizon 。当然 Torizon Extension 的功能也远不止如此。
  • 热度 2
    2021-4-22 15:06
    2737 次阅读|
    1 个评论
    By Toradex胡珊逢 Visual Studio Code在软件开发领域具有十分广泛的应用,其支持多种编程语言,丰富的插件极大得提高了开发效率,同时这也是一个非常开放的平台。本文接下来将介绍如何在Visual Studio Code中使用Yocto Project生成的Linux SDK,并针对Arm处理器进行C/C++应用交叉编译和调试。 首先使用 Yocto Project生成SDK ,我们这里以Apalis iMX8上的minimal console image为例,其对应的SDK为tdx-xwayland-glibc-x86_64-Reference-Minimal-Image-aarch64-apalis-imx8-toolchain-5.2.0.sh。直接运行该文件,将其安装到Linux电脑上,例如/home/ben/Toradex/LinuxDevelop/LinuxSDK/v5/arm64路径下。 然后参考 这里的说明 在Linux电脑上安装Visual Studio Code。在Extension中安装一些常用的插件,如C/C++,C++ Intellisense,Makefile Creator等。 Visual Studio Code并不像Visual Studio,后者集成了完整的代码编辑、编译和调试工具,Visual Studio Code则提供了相应的框架,根据具体使用的编程语言和用户习惯来实现对应的步骤或者任务。当然也有很多公司、组织或者个人提供现成的插件,这简化了配置任务。目前Visual Studio Code还没有现成的插件可以直接使用Yocto Project生成的Linux SDK,因此我们通过直接配置JSON文件,制定相应的编译和调试步骤。 vscode-tdxlinux 是配置好的例程,接下来我们将对其中配置进行说明,以及介绍使用方法。 下载上面的例程后,在文件夹中会有下面文件。 hello.c是一个演示代码,Makefile是编译规则文件,.vscode文件夹中四个json文件即用于配置Visual Studio Code。 c_cpp_properties.json env中包含一些自定义的变量,例如SDK版本,开发板名字,以及SDK根目录。可以用$符号对其引用,例如${env.sdkroot}引用SDK根目录。 configurations中是Visual Studio Code规定的一些设置。includePath包含项目编译用的头文件所在目录,这里包括SDK中文件系统里和gcc本身的头文件。browse是浏览头文件时可以查找的目录,常用于VS Code编写代码时用Go To Definition打开对应文件。defines预定义一些宏,__linux__:指定目标系统为Linux,__aarch64__:目标处理器为64bit Arm。intelliSenseMode将IntelliSense Mode映射到对应的平台和处理器构架,Apalis iMX8是64位处理器,所以这里选择linux-gcc-arm64。这里的配置还可以通过ctl+shift+p组合键盘选择UI方式来配置。 settings.json 这里定了一些变量,其他文件可以通过${config:var}来引用,例如${config:tdxlinuxsdk.sdkroot}。 tasks.json 这里配置了编译相关的任务。 env配置GCC编译工具,编译参数等,这部分内容来自SDK的environment-setup-aarch64-tdx-linux文件。 Run Build Task调用相关任务。 launch.json 这里配置调试方法。 嵌入式Linux通过使用gdb调试C/C++应用。在configurations中MIMode为gdb,miDebuggerPath为gdb所在目录,这是SDK中包含的软件。 customLaunchSetupCommands是gdb具体执行步骤。首先使用gdb的target remote extend-remote连接IP为192.168.20.91的目标设备即Apalis iMX8,端口为1234。第二步remote put将本地编译好的hello二进制文件上传到Apalis iMX8。最后在main函数处设置一个断点。通过上面设置,点击VS Code中的debug即可进入调试。上面的每个步骤同样可以根据项目或者用户习惯调整。下面我们将演示从编译到调试的流程。 按组合键ctrl+shift+b选择TdxLinux SDK Make. 编译完成后可以通过file命令查看hello程序的格式属性,ARM aarch64格式。 查看Apalis iMX8的IP地址。192.168.20.97也是launch.json中设置的IP。 在Apalis iMX8上运行gbdserver程序,侦听端口为1234。 在hello.c程序的printf函数设置一个断点。 点击VS Code中的调试按键。 点击step over进行单步调试。 在Apalis iMX8调试串口中可以看到执行结果。 总结 上面是VS Code交叉编译和调试的简单介绍,提供了Eclipse之外的另一种开发环境。用户可以重新调整配置文件,并配合其他插件如Makefile Creator实现个性化的IDE。 ​
相关资源