下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

将 Visual Studio Code 用于 FreeRTOS 开发

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 项目进行尝试。

作者简介

Marc Goodner 是 [Microsoft 的 C + + 团队] 项目经理,致力于改进 Visual Studio 和Visual Studio Code中的嵌入式支持。
查看此作者撰写的文章
FreeRTOS 论坛 获得来自专家的行业领先支持,并与全球同行合作。 查看论坛
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.