Visual Studio Code 已成为非常受欢迎的代码编辑器。您可能已经在用它完成开发任务,但可能尚未将其用于嵌入式开发工作。或许您正将其用于嵌入式开发工作,因为与现有的嵌入式开发工具相比,您更喜欢它的编辑环境,但您尚未能够确定如何完成配置,以构建和调试您的项目。这篇文章将向您展示如何将 VS Code 设置为 FreeRTOS 项目的有效开发环境。它将涵盖您应安装的一些关键扩展,以及有关如何开始的多个选项,最后还有一些您可能想自己探索的其他选项。
如果您是初次使用 VS Code ,您可以在 VS Code 网站上找到针对您所用操作系统的一般功能概览和下载内容。VS Code 是一个轻量级的编辑器,您可以根据需求定制,通过添加扩展获得额外的语言支持或其他功能。它支持调试,并与 Git 集成用于源代码管理。VS Code 适用于您原本的代码,没有项目文件格式。只需打开计算机上包含源代码的文件夹,即点击文件 > 打开文件夹 (Ctrl + K, Ctrl + O)。VS Code 将建议您使用与您打开的文件夹中的代码相关的扩展(如果尚未安装)。VS Code 还具有许多高级编辑功能,如多个光标。要从 Help 菜单中了解有关这些核心功能的详细信息,请打开 Interactive Playground,它将帮助您了解这些功能。
扩展与基本设置
由于是以 C 语言编写的,您将需要安装 VS Code 的 C + + 扩展 FreeRTOS 。如果您的FreeRTOS项目使用 CMake ,您还应安装 CMake Tools 扩展。如果您想从 VS Code 部署和调试目标设备, Cortex-Debug 扩展是一个很好的选择。以上即为我将向您展示如何为 FreeRTOS 项目进行配置的扩展。
此外,您还需要为嵌入式开发进行机器设置(如果尚未设置)。这通常意味着为您的目标设备安装交叉编译器和相应的闪存/调试工具。目标设备的入门指南应当含有关于此操作的说明。
获取 FreeRTOS 项目
FreeRTOS提供入门指南 ,其中包含许多主板以及许多不同的集成开发环境 (IDE)、编译器和生成选择的示例。该文档很有用,但您仍然可能找不到与您使用的设备匹配的内容。如果您找到了有效匹配内容,请关注使用 makefiles 尝试使用 VS Code 的 GCC。改编用于另一 IDE 的项目将很困难,因为它可能使用 IDE 的专有项目文件。
除了这种入门方式以外,另一种入门方式是咨询您的硅供应商,许多硅供应商提供配置工具,可以生成适用于其主板的经配置的 FreeRTOS 项目,这是一个很好的起点。要使用带有 VS Code 的生成项目选择 GCC 作为目标编译器,通常可以选择生成基于 make 或 CMake 的项目的选项,这些项目可以在 VS Code 中轻松使用。Shawn Hymel 对使用 FreeRTOS ST 的工具进行了很好的概览。他在演示中展示了 STM32CubeIDE ,但还有一个独立的配置工具,名为 STM32CubeMX ,无需直接 IDE 集成即可生成他所展示的项目。这个工具的运作方式与他所演示的方式相同。唯一不同的是,您需要在项目管理选项卡上选择 Makefile 作为 Toolchain/IDE 选项,然后选择 Generate Code。

NXP 的 Xpresso 配置工具和 Espressif 的 IDF 工具也可以为其设备生成基于 CMake 的 FreeRTOS 项目。另一种 FreeRTOS 开始方法是使用 FreeRTOS AWS 项目,该项目有许多板的演示。
使用 makefiles
生成 FreeRTOS 项目后,在 VS Code 中打开项目的根文件夹。在 VS Code 中,您可以通过文件 > 打开文件夹 (Ctrl+K, Ctrl+O) 或通过命令行导航到项目根目录,然后输入:
code .

C++ 扩展使为 C 和 C++ 文件启用 IntelliSense。IntelliSense 不仅仅提供简单的语法突出显示,还提供基于变量类型、函数定义等的智能代码。要为 C++ 扩展配置IntelliSense,我们需要让它知道我们的标头在哪里,编译选项是什么等。对于 makefiles ,没有任何自动处理的信息,但添加起来相对容易。打开 .vscode/c_cpp_properties.json 文件。首先,您需要将 intelliSenseMode 变量更新为 gcc-arm ,并在 compilerPath 变量中提供交叉编译器。现在打开您的 makefile 并查找包含列表。将其复制到 c_cpp_properties.json 文件中的 includePath 数组中。为每个文件夹位置添加前缀 ${workspaceFolder} ,告诉其使用相对于项目文件夹的路径。此处的技巧是使用 VS Code 的多行光标(转到“帮助” , “互动游乐场”以了解此功能)。您还可以将定义添加到定义数组,将编译器标记添加到 compilerArgs 数组,以进一步改进结果。
以下是由 STM32CubeMX 生成的基本 FreeRTOS 项目的示例 c_cpp_properties.json 文件。
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "${workspaceFolder}/Core/Inc", "${workspaceFolder}/Drivers/STM32F7xx_HAL_Driver/Inc", "${workspaceFolder}/Drivers/STM32F7xx_HAL_Driver/Inc/Legacy", "${workspaceFolder}/Middlewares/Third_Party/FreeRTOS/Source/include", "${workspaceFolder}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2", "${workspaceFolder}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1", "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F7xx/Include", "${workspaceFolder}/Drivers/CMSIS/Include" ], "defines": [ "USE_HAL_DRIVER", "STM32F767xx" ], "compilerPath": "/opt/arm-none-eabi/gcc-arm-none-eabi-9-2020-q2-update/bin/arm-none-eabi-gcc", "compilerArgs": [ "-mcpu=cortex-m7", "-mthumb", "-mfpu=fpv5-d16", "-mfloat-abi=hard" ], "cStandard": "gnu11", "cppStandard": "gnu++14", "intelliSenseMode": "gcc-arm" } ], "version": 4 }
若要构建应用程序,假设路径上所有工具都可用,请转到 VS Code 终端窗口并运行 make。如果终端不可见,可以通过菜单的视图 > 终端打开 (Ctrl+`) 。

如果存在编译错误,错误将显示在问题输出窗口中,且支持直接导航到引起错误的代码行。
使用 CMake
如果您有使用 CMake 的 FreeRTOS 项目,则在 CMake Tools 扩展程序查询 CMake 缓存,获取之前需要手动配置的信息时,需要配置的内容较少。但是,扩展程序将尝试使用它在系统上找到的编译器,作为“套件”对您的项目进行配置。如果扩展提示您使用套件,请您选择“未指定” ,以便配置一些可影响嵌入式项目的附加选项。
在使用 CMake 并嵌入时您可能会遇到一个问题:它将尝试编译一个简单的 C 程序,以验证您是否具有正常工作的 C 编译器。这不适用于交叉编译器,因为经编译的程序用于不同的系统。您可以发送一个选项,告诉 CMake 不要尝试。如果选项没有出现,请打开 .vscode/settings.json ,并添加 cmake.configureSettings。在该结构中添加名称值对 CMAKE_C_COMPILER_WORKS TRUE 以告诉 CMake 此检查不必要。您还可以通过此结构向 CMake 传递其他参数,例如,在生成指令中以 -D 为前缀的任何参数。
以下是用于编译演示 FreeRTOS AWS 项目的 settings.json 示例。请注意,编译器、供应商和板的选项都是您正在运行的演示特定的,并且属于使用 CMake 构建项目的命令行的一部分。在这里,它们已经映射到 cmake.configureSettings 数组中,以便我们可以在 VS Code 中构建项目。
Settings.json{ "cmake.configureOnOpen": true, "cmake.configureSettings": { "COMPILER": "xtensa-esp32", "CMAKE_C_COMPILER_WORKS": "TRUE", "VENDOR": "espressif", "BOARD": "esp32_wrover_kit" }, "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools" }
更新这些设置后,您可以右键单击 CMakeLists.txt 文件,或按 F1使用命令托盘,然后选择 CMake 删除缓存并重新配置。这会在我们将正确标记传递给 CMake 之前首次打开文件夹时,删除不成功的缓存生成中的所有项目。现在,您可以构建项目,而 IntelliSense 应始终工作。
如果存在编译错误,错误将显示在问题输出窗口中,且支持直接导航到引起错误的代码行。
调试
Cortex-Debug 扩展是开始在设备上部署和调试 FreeRTOS 应用程序的好方法。此扩展适用于一系列不同的硬件调试器和相应软件。您需要配置适用于探针的环境,然后配置扩展,以便使用。开始进行特定配置的最佳位置是扩展的 wiki 。

更改 VS Code 中的调试视角,并选择创建 launch.json 文件以开始。这会提示命令托盘中的选项列表,在此处选择 Cortex 调试。这将生成一个基础的 launch.json 文件,您可以为硬件探头和目标设备配置该文件。
以下的 launch.json 示例配置用于使用带有 STM32 板的 OpenOCD。在这里,必须配置的部分为“我的构建输出”中的可执行文件以及调试硬件与目标的配置文件。您将需要为自己的环境更新上述设置。Cortex-Debug 支持配置其他不同探针,有关详细信息,请参阅 wiki。
{ "version": "0.2.0", "configurations": [ { "name": "Cortex Debug", "cwd": "${workspaceRoot}", "executable": "./build/nucleo-f767zi-freertos-blink.elf", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "configFiles": [ "/usr/share/openocd/scripts/interface/stlink-v2-1.cfg", "/usr/share/openocd/scripts/target/stm32f7x.cfg" ] } ] }
您还需要更新 settings.json ,告诉 Cortex-Debug 扩展程序交叉编译器工具的位置,以便它可以找到合适的 gdb。
{ "cortex-debug.armToolchainPath": "/opt/arm-none-eabi/gcc-arm-none-eabi-9-2020-q2-update/bin" }
其他扩展
VS Code 有很多扩展,当您首次打开文件时,通常会提示您有已注册的扩展。在FreeRTOS开发中,您可能会遇到 .S 文件中的汇编程序和 .ld 文件中的链接器脚本, x86 和 x86_64 程序集且 LinkerScript 扩展可以为每个相应的文件类型提供语法突出显示。
获取帮助
大多数 VS Code 扩展都有一个概述页面,其中包含指向其存储库的链接,通常可以在其中找到问题列表。有关文档链接、常见问题解答、已知问题及其对 VS Code 贡献的功能,这些概述页面均值得参考。

结论
VS Code 可以与您的代码一起使用,因其无需导入到新的项目格式,具有许多高级编辑功能,并包括 git 集成。您可能已正在将其用于其他类型的开发任务,或者尝试将其用于嵌入式开发,但无法确定如何对其进行完全配置。VS Code 可以成为您使用FreeRTOS 嵌入式开发的有效环境。关键是要利用合适的扩展来满足您的需求,并了解如何为您的环境对其进行配置。设置后,即可轻松使用基于 CMake 或 make 的FreeRTOS项目。希望这篇文章清晰展示了您应当如何使用自己的 FreeRTOS 项目进行尝试。