使用vscode进行Zephyr应用开发

背景

许多使用者在进行Zephyr开发时,一大需求就是希望能够使用图形化的IDE进行开发,如像Keil、IAR、CodeWarrior、Eclipse。其实作为一个相对大型的嵌入式软件平台,Zephyr并没有与之完美 配套的IDE,正如也很难找到与Linux内核开发配套的IDE一样。Zephyr社区中主流进行开发的方式是采用编辑器(vim, sublime)等编辑代码,再在命令行中通过一系列工具,如west、ninja, make 进行编译、调试等。这种方式的优点是一旦熟练掌握后便十分灵活方便,但缺点是相应的学习曲线很长,需求熟悉掌握很多工具,而且有时命令行的效率确实不如图形化的方式,例如调试、浏览代码的场合。

新一代编辑器vscode的快速发展以及其丰富的插件体系,使得采用类似IDE的方式进行zephyr开发成为可能,虽然不能解决所有问题,有时还需要结合命令行去完成部分工作,还是值得一试的。本章主要介绍 如何使用vscode进行Zephyr应用开发,主要完成如下任务:

  • 高效的代码浏览

  • Zephyr应用的编译与构建

  • Zephyr应用的调试

  • Zephyr的代码提交(待完成)

备注

Zephyr构建系统的核心是**west+cmake+python工具**, 采用命令行可以完成所有的开发工作,IDE的图形化开发方式是建立在构建系统之上的“皮”, 皮可以换,可以是eclipse,也可以是vscode, 但本体不会变化。

准备工作

本章所描述的工作都是在Linux环境下实现,所使用的系统为Debian 11,相关内容经简单修改后同样适用于Windows环境。Windows下的Zephyr开发环境可以参见 Windows下开发环境的搭建

首先需要下载并安装好vscode, 并推荐安装如下vscode扩展插件:

vscode插件列表

插件名

用途

C/C++

C/C++ IntelliSense, 调试与代码浏览

CMake

CMake语言支持

kconfig

kconfig语言支持

Arm Assembly

arm汇编语言支持

nRF DeviceTree

Zephyr DeviceTree支持

Trailing Spaces

高亮行尾部多余空格

代码浏览

  • vscode workspace布局 建议采用vscode multi-root workspace的方式去布局相应文件结构,可参考如下结构:

<vscode zephyr_workspace>
├── zephyr  zephyr-os代码
├── modules zephyr modules(按需添加)
├── app     自定义zephyr应用(如果采用Zephyr自带的例子可以不需要
└── build   zephyr应用构建目录

备注

为了避免zephyr的构建污染zephyr的git仓库,同时为了方便管理,建议把build目录单独存放

  • C/C++ IntelliSense配置

vscode的C/C++ IntelliSense插件功能强大,但由于整个zephyr代码规模较大,IntelliSense的默认配置无法支撑,所以我们需要 借助 compile_commands.json 使得C/C++ IntelliSense能够准确找到相关代码。

由于Zephyr的构建系统是基于CMake的,每次CMake配置之后会生成 compile_commands.json,里面包含了本次构建所涉及的文件、编 译器选项。需要注意的的是 compile_commands.json 只包含了本次构建相关内容,不相关文件不会包含在里面,因此vscode的C/C++ IntelliSense只会覆盖相关文件,例如如果构建过程中没使用网络相关功能,那么 subsys/net 下的代码则不会被搜索。

在整个vscode workspace层级(注意不是folder层级)设置C/C++ IntelliSense的 compileCommands 属性正确指 向 compile_commands.json 即可生效。具体的vscode workspace参考配置如下:

由于必须先配置CMake后才会有 compile_commands.json,因此需要在build下通过如下方式生成:

  • 在build目录下,通过命令行生成:

    cmake -DBOARD=<target board>  <path-to-zephyr-application>
    
  • 或者通过,运行 编译与构建 章节中所定义的 Zephyr 配置 任务进行

编译与构建

Zephyr的编译和构建核心是构建在命令行之上的,要实现vscode和Zephyr构建系统的对接,需要使用vscode的 task 机制,即为 vscode配置一系列Zephyr相关的task。由于这些task是和构建相关,因此相关实现放在 :file:build/.vscode/tasks.json 中, 参考实现如下:

有了如上一系列tasks配置之后,就可以在vscode的 Run Task 中选择相应的zephyr任务,如构建,menuconfig, clean等。

调试

Zephyr默认的调试界面的是gdb, 要实现vscode和Zephyr调试界面的对接,需要使用vscode的 lanuch 机制,即为 vscode配置一系列Zephyr相关的run。由于这些task是和构建相关,因此相关实现放在 :file:build/.vscode/launch.json 中, 参考实现如下:

有了如上一系列launch配置之后,就可以在vscode中唤起gdb,并通过图形化的方式进行调试,包括单步运行、断点、查看变量等等。

代码提交

参与Zephyr社区的代码提交,核心是掌握git相关技巧。当前还是建议通过命令行的方式进行git操作。