

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CMake 与 FreeRTOS 一起使用
<a name="getting-started-cmake"></a>

**重要**  <a name="deprecation-message-general"></a>
此页面指向已弃用的 Amazon FreeRTOS 存储库。当您创建新项目时，我们建议[从此处开始](freertos-getting-started-modular.md)。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目，请参阅 [Amazon-FreeRTOS Github 存储库迁移指南](github-repo-migration.md)。

您可以使用 CMake 从 FreeRTOS 应用程序源代码生成项目生成文件，以及生成和运行源代码。

您还可以使用 IDE，在符合 FreeRTOS 要求的设备上编辑、调试、编译、刷写和运行代码。每个主板特定的入门指南提供了针对特定平台设置 IDE 的指南。如果您更喜欢在没有 IDE 的情况下工作，则可以使用其他第三方代码编辑和调试工具来开发和调试代码，然后使用 CMake 来生成和运行应用程序。

以下主板支持 CMake：
+ Espressif-C ESP32 DevKit
+ Espressif ESP-WROVER-KIT
+ 英飞凌物 XMC4800 联网连接套件
+ Marvell MW320 AWS IoT 入门套件
+ Marvell MW322 AWS IoT 入门套件
+ 微芯片好奇号 PIC32 MZEF 捆绑包
+ Nordic n RF52840 DK 开发套件
+ STMicroelectronicsSTM32L4 探索套件物联网节点
+ 德州仪器 CC3220 SF-LAUNCHXL
+ Microsoft Windows Simulator

有关使用 FreeRTOS 的更多信息 CMake ，请参阅以下主题。

**Topics**
+ [先决条件](#building-cmake-prereqs)
+ [使用第三方代码编辑器和调试工具开发 FreeRTOS 应用程序](#developing-third-party)
+ [使用 FreeRTOS 构建 CMake](#building-cmake)

## 先决条件
<a name="building-cmake-prereqs"></a>

请先确保主机符合以下先决条件，然后再继续：
+ 设备的编译工具链必须支持机器的操作系统。 CMake 支持所有版本的 Windows、macOS 和 Linux

  不支持 Windows Subsystem for Linux (WSL)。 CMake 在 Windows 计算机上使用本机。
+ 必须安装 CMake 版本 3.13 或更高版本。

  您可以 CMake 从 [CMake.org](https://cmake.org/download/) 下载的二进制发行版。
**注意**  
如果您下载的二进制发行版 CMake，请务必先将 CMake 可执行文件添加到 PATH 环境变量中，然后再 CMake 从命令行使用。

  [你也可以 CMake 使用软件包管理器下载和安装，比如 macOS 上的 h [omebrew](https://brew.sh/)，在 Windows 上使用 scoop [或](https://chocolatey.org/) chocolatey。](https://scoop.sh/)
**注意**  
许多 Linux 发行版的软件包管理器中提供的软件包版本是 out-of-date。 CMake 如果你的发行版的包管理器没有提供最新版本的 CMake，你可以尝试其他包管理器，比如`linuxbrew`或`nix`。
+ 必须具有兼容的本机构建系统。

  CMake 可以针对许多原生构建系统，包括 [GNU Make 或 N](https://www.gnu.org/software/make/) [inja](https://github.com/ninja-build/ninja/releases)。Make 和 Ninja 都可以使用程序包管理器安装在 Linux、macOS 和 Windows 上。如果在 Windows 上使用 Make，则可从 [Equation](http://www.equation.com/servlet/equation.cmd?fa=make) 安装独立版本，或安装捆绑了 Make 的 [MinGW](https://sourceforge.net/projects/mingw-w64/files/)。
**注意**  
MinGW 中的 Make 可执行文件名为 `mingw32-make.exe`，而不是 `make.exe`。

  我们建议使用 Ninja，因为它不仅速度快于 Make，还可提供对所有桌面操作系统的本机支持。

## 使用第三方代码编辑器和调试工具开发 FreeRTOS 应用程序
<a name="developing-third-party"></a>

您可以使用代码编辑器和调试扩展或者第三方调试工具来为 FreeRTOS 开发应用程序。

例如，如果您使用 [Visual Studio Code](https://code.visualstudio.com/) 作为代码编辑器，则可以安装 [Cortex-Debug](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug) VS Code 扩展作为调试程序。完成应用程序开发后，可以调用 CMake 命令行工具从 VS Code 中构建项目。有关使用 CMake 构建 FreeRTOS 应用程序的更多信息，请参阅。[使用 FreeRTOS 构建 CMake](#building-cmake)

对于调试，您可以向 VS Code 提供类似于下文的调试配置：

```
"configurations": [
    {
        "name": "Cortex Debug",
        "cwd": "${workspaceRoot}",
        "executable": "./build/st/stm32l475_discovery/aws_demos.elf",
        "request": "launch",
        "type": "cortex-debug",
        "servertype": "stutil"
    }
]
```

## 使用 FreeRTOS 构建 CMake
<a name="building-cmake"></a>

CMake 默认情况下，将您的主机操作系统作为目标系统。要将其用于交叉编译， CMake 需要一个工具链文件，该文件指定要使用的编译器。在 FreeRTOS 中，我们在 `{{freertos}}/tools/cmake/toolchains` 中提供了默认工具链文件。向其提供此文件的方法 CMake 取决于您使用的是 CMake命令行界面还是 GUI。有关更多详细信息，请按照以下[生成生成文件（CMake 命令行工具）](#cmake-gen-cli)说明进行操作。有关中交叉编译的更多信息 CMake，请参阅官方 CMake 维基[CrossCompiling](https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/CrossCompiling)中的内容。

**生成 CMake基于项目的方法**

1. 运行 CMake 为原生编译系统（例如 Make 或 Ninja）生成生成文件。

   您可以使用[CMake 命令行工具](https://cmake.org/cmake/help/latest/manual/cmake.1.html)或 [CMake GUI](https://cmake.org/cmake/help/latest/manual/cmake-gui.1.html) 为原生构建系统生成生成文件。

   有关生成 FreeRTOS 构建文件的信息，请参阅[生成生成文件（CMake 命令行工具）](#cmake-gen-cli)和[生成生成文件 (CMake GUI)](#cmake-gen-gui)。

1. 调用本机构建系统，将项目制作为可执行文件。

   有关如何创建 FreeRTOS 构建文件的信息，请参阅[从生成的构建文件构建 FreeRTOS](#cmake-build)。

### 生成生成文件（CMake 命令行工具）
<a name="cmake-gen-cli"></a>

你可以使用 CMake 命令行工具 (cmake) 为 FreeRTOS 生成构建文件。要生成构建文件，您需要指定目标主板、编译器以及源代码和构建目录的位置。

您可以对 cmake 使用以下选项：
+ `-DVENDOR` – 指定目标主板。
+ `-DCOMPILER` – 指定编译器。
+ `-S` – 指定源代码的位置。
+ `-B` –指定生成的构建文件的位置。

 

**注意**  
编译器必须包含在系统的 `PATH` 变量中，或者必须指定编译器的位置。

例如，如果供应商是德州仪器，主板是 La CC3220 unchpad，编译器是 GCC for ARM，则可以发出以下命令将源文件从当前目录构建到名为的目录中：`{{build-directory}}`

```
cmake -DVENDOR=ti -DBOARD=cc3220_launchpad -DCOMPILER=arm-ti -S . -B {{build-directory}}
```

**注意**  
如果您使用的是 Windows，则必须指定本机生成系统，因为默认情况下 CMake 使用 Visual Studio。例如：  

```
cmake -DVENDOR=ti -DBOARD=cc3220_launchpad -DCOMPILER=arm-ti -S . -B {{build-directory}} -G Ninja
```
或：  

```
cmake -DVENDOR=ti -DBOARD=cc3220_launchpad -DCOMPILER=arm-ti -S . -B {{build-directory}} -G "MinGW Makefiles"
```

正则表达式 `${VENDOR}.*` 和 `${BOARD}.*` 用于搜索匹配的主板，因此对于 `VENDOR` 和 `BOARD` 选项，不必使用完整的供应商和主板名称。在只有单个名称匹配的情况下，部分名称也是可行的。例如，以下命令可从同一源文件生成相同的构建文件：

```
cmake -DVENDOR=ti -DCOMPILER=arm-ti -S . -B {{build-directory}}
```

```
cmake -DBOARD=cc3220 -DCOMPILER=arm-ti -S . -B {{build-directory}}
```

```
cmake -DVENDOR=t -DBOARD=cc -DCOMPILER=arm-ti -S . -B {{build-directory}}
```

如果要使用不在默认目录 `cmake/toolchains` 中的工具链文件，则可使用 `CMAKE_TOOLCHAIN_FILE` 选项。例如：

```
cmake -DBOARD=cc3220 -DCMAKE_TOOLCHAIN_FILE='/path/to/toolchain_file.cmake' -S . -B {{build-directory}}
```

如果工具链文件没有为您的编译器使用绝对路径，并且您没有将编译器添加到`PATH`环境变量中，则 CMake 可能无法找到它。要确保 CMake 找到你的工具链文件，你可以使用`AFR_TOOLCHAIN_PATH`选项。此选项将搜索指定的工具链目录路径以及 `bin` 下的工具链子文件夹。例如：

```
cmake -DBOARD=cc3220 -DCMAKE_TOOLCHAIN_FILE='/path/to/toolchain_file.cmake' -DAFR_TOOLCHAIN_PATH='/path/to/toolchain/' -S . -B {{build-directory}}
```

要启用调试，可将 `CMAKE_BUILD_TYPE` 设置为 `debug`。启用此选项后，在编译选项中 CMake 添加调试标志，并使用调试符号构建 FreeRTOS。

```
# Build with debug symbols
cmake -DBOARD=cc3220 -DCOMPILER=arm-ti -DCMAKE_BUILD_TYPE=debug -S . -B {{build-directory}}
```

也可以将 `CMAKE_BUILD_TYPE` 设置为 `release`，将优化标志添加到编译选项。

### 生成生成文件 (CMake GUI)
<a name="cmake-gen-gui"></a>

你可以使用 CMake GUI 来生成 FreeRTOS 编译文件。

**使用 CMake GUI 生成生成文件**

1. 从命令行中发出 `cmake-gui` 以启动 GUI。

1. 选择 **Browse Source (浏览源)** 并指定源输入，然后选择 **Browse Build (浏览构建)** 并指定构建输出。  
![CMake 窗口，其中包含源代码位置和生成二进制文件位置的输入字段，以及浏览源代码、浏览构建目录、搜索、添加或删除条目以及查看分组或高级选项的选项。](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/cmake-gui1.png)

1. 选择 **Configure (配置)**，然后在 **Specify the build generator for this project (指定此项目的构建生成器)** 下，查找并选择要用于构建所生成的构建文件的构建系统。如果您未看到弹出窗口，则可能正在重用现有的构建目录。在这种情况下，请从 “**文件**” 菜单中 CMake 选择 “**删除缓存**” 来删除缓存。  
![CMake设置对话框，其中包含用于将项目的生成器指定为 Unix Makefiles 的选项，以及指定用于交叉编译的工具链文件。](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/cmake-gui2.png)

1. 选择 **Specify toolchain file for cross-compiling (指定用于交叉编译的工具链文件)**，然后选择 **Next (下一步)**。

1. 选择工具链文件（例如，`{{freertos}}/tools/cmake/toolchains/arm-ti.cmake`），然后选择 **Finish (完成)**。

   FreeRTOS 的默认配置为模板主板，该主板不提供任何可移植层目标。结果，将显示一个包含消息 Error in configuration process 的窗口。
**注意**  
如果您看到以下错误：  

   ```
   CMake Error at tools/cmake/toolchains/find_compiler.cmake:23 (message):
   Compiler not found, you can specify search path with AFR_TOOLCHAIN_PATH.
   ```

   这意味着编译器不在您的 `PATH` 环境变量中。你可以在 GUI 中设置`AFR_TOOLCHAIN_PATH`变量来告诉你 CMake 在哪里安装了编译器。如果您未看到 `AFR_TOOLCHAIN_PATH` 变量，请选择 **Add Entry (添加条目)**。在弹出窗口中，在 **Name (名称)** 下，键入 **AFR\_TOOLCHAIN\_PATH**。在 **Compiler Path (编译器路径)** 下，键入编译器的路径，例如 `C:/toolchains/arm-none-eabi-gcc`。

1. GUI 现在应如下所示：  
![CMake 用于构建 FreeRTOS 的配置窗口，其中选择了供应商主板，启用了模块并指定了构建路径。](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/cmake-gui3.png)

   选择 **AFR\_BOARD**，选择主板，然后选择 **Configure (配置)**。

1. 选择 “**生成**”。 CMake 生成生成系统文件（例如 makefile 或 ninja 文件），这些文件将出现在您在第一步中指定的构建目录中。按照下一节中的说明生成二进制映像。

### 从生成的构建文件构建 FreeRTOS
<a name="cmake-build"></a>

#### 使用本机构建系统构建
<a name="gsg-cmake-native"></a>

可以使用本机构建系统构建 FreeRTOS，方法是从输出二进制目录调用构建系统命令。

例如，如果构建文件输出目录为 `<build_dir>`，并且您使用 Make 作为本机构建系统，则可运行以下命令：

```
cd <build_dir>
make -j4
```

#### 用建筑物 CMake
<a name="gsg-cmake-build"></a>

你也可以使用 CMake 命令行工具来构建 FreeRTOS。 CMake 为调用原生构建系统提供了一个抽象层。例如：

```
cmake --build {{build_dir}}
```

以下是 CMake 命令行工具编译模式的其他一些常见用法：

```
# Take advantage of CPU cores.
cmake --build {{build_dir}} --parallel 8
```

```
# Build specific targets.
cmake --build {{build_dir}} --target afr_kernel
```

```
# Clean first, then build.
cmake --build {{build_dir}} --clean-first
```

有关 CMake 构建模式的更多信息，请参阅[CMake 文档](https://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode)。