

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

# Microchip Curiosity PIC32MZEF 的演示启动加载程序
<a name="microchip-bootloader"></a>

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

**注意**  
经 Microchip 同意，我们将从 FreeRTOS 参考集成存储库主分支中移除 Curiosity PIC32MZEF (DM320104)，并且在新版本中将不再使用包含此开发主板。Microchip 已发布[官方通知](https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM320104)，建议不要继续在新设计中使用 PIC32MZEF (DM320104)。PIC32MZEF 项目和源代码仍然可以通过之前的版本标签进行访问。Microchip 建议客户使用 Curiosity [ PIC32MZ-EF-2.0 开发主板 (DM320209)](https://devices.amazonaws.com/detail/a3G0h0000077I69EAE/Curiosity-PIC32MZ-EF-2-0-Development-Board) 进行新设计。PIC32MZv1 平台仍然可以在 FreeRTOS 参考集成存储库的 [v202012.00](https://github.com/aws/amazon-freertos/tree/202012.00) 中找到。但是，FreeRTOS 参考的 [v202107.00](https://github.com/aws/amazon-freertos/tree/202107.00) 不再支持该平台。

 此演示启动加载程序实施固件版本检查、加密签名验证和应用程序自我测试。这些功能支持适用于 FreeRTOS 的空中下载 (OTA) 固件更新。

固件验证包括验证无线接收的新固件的真实性和完整性。在启动之前，启动加载程序验证应用程序的加密签名。该演示在 SHA-256 之上使用了椭圆曲线数字签名算法 (ECDSA)。提供的实用程序可用于生成签名的应用程序，该应用程序可刷写设备。

启动加载程序支持 OTA 需要的以下功能：
+ 在设备上维护应用程序映像，并在这些映像之间切换。
+ 允许对收到的 OTA 映像执行自行测试并在出现故障时回退。
+ 检查 OTA 更新映像的签名和版本。

**注意**  
要设置和运行 FreeRTOS 演示，请按照[开始使用 FreeRTOS](freertos-getting-started.md)中的步骤操作。

## 启动加载程序状态
<a name="bootloader-states"></a>

以下状态机中显示启动加载程序进程。

![\[启动引导加载程序状态机，展示了初始化、验证、执行状态和带有“通知错误”选项的错误状态。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/bootloader-states.png)


下表介绍了启动加载程序状态。


| 启动加载程序状态 | 描述 | 
| --- | --- | 
|  初始化  |  启动加载程序处于初始化状态。  | 
|  验证  |  启动加载程序正在验证设备上存在的映像。  | 
|  执行映像  |  启动加载程序正在启动所选映像。  | 
|  执行默认映像  |  启动加载程序正在启动默认映像。  | 
|  错误  |  启动加载程序处于出错状态。  | 

在前面的示意图中，`Execute Image` 和 `Execute Default` 都显示为 `Execution` 状态。

**启动加载程序执行状态**  
启动加载程序处于 `Execution` 状态，已准备好启动经过验证的选定映像。如果要启动的映像位于较高的库中，则在执行映像之前交换库，因为应用程序始终针对较低的库生成。

**启动加载程序默认执行状态**  
如果启动默认映像的配置选项已启用，则启动加载程序将从默认执行地址启动应用程序。除了在调试期间，否则应禁用此选项。

**启动加载程序出错状态**  
启动加载程序处于出错状态，设备上没有有效的映像。启动加载程序必须通知用户。默认实施发送日志消息到控制台，并无限期快速闪烁主板上的 LED。

## 闪存设备
<a name="flash-device"></a>

Microchip Curiosity PIC32MZEF 平台包含 2 MB 的内部程序闪存，划分为两个库。它支持这两个库之间的内存交换映射和实时更新。演示启动加载程序在单独的较低引导闪存区域中编程。

![\[内存布局图，展示了分别映射到引导加载程序、应用程序库 0 和应用程序库 1 的低位引导闪存区域、1 MB 的低位程序闪存区域和 2 MB 区域的高位程序闪存区域。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/flash-device.png)


## 应用程序映像结构
<a name="application-image-structure"></a>

![\[OTA 映像结构，展示了标头、描述符、应用程序二进制文件（由签署者服务签署），以及带有幻码、序列号、起始和结束地址、执行地址、硬件 ID 等字段的后缀部分。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/application-image-structure.png)


该图显示存储在设备的各个库中应用程序映像的主要组件。


| 组件 | 大小（字节） | 
| --- | --- | 
|  映像标头  |  8 字节  | 
|  映像描述符  |  24 字节  | 
|  应用程序二进制文件  |   < 1 MB - (324)  | 
|  Trailer  |  292 字节  | 

## 映像标头
<a name="image-header"></a>

设备上的应用程序映像必须以由幻码和映像标志组成的标头为开头。


| 标头字段 | 大小（字节） | 
| --- | --- | 
|  幻码  |  7 字节  | 
|  映像标志  |  1 字节  | 

### 幻码
<a name="magic-code"></a>

闪存设备上的映像必须以幻码开头。默认幻码为 `@AFRTOS`。启动加载程序在启动映像之前检查是否存在有效的幻码。这是验证的第一步。

### 映像标志
<a name="image-flags"></a>

映像标志用于存储应用程序映像的状态。标志在 OTA 过程中使用。两个库的映像标志确定了设备的状态。如果正在执行的映像标记为等待提交，这意味着设备处于 OTA 自我测试阶段。即使设备上的映像标记为有效，在每次启动时也会经过相同的验证步骤。如果某个映像被标记为新的，则启动加载程序会将其标记为等待提交，并在验证之后启动它进行自我测试。引导加载程序还会初始化并启动监视程序计时器，以便在新的 OTA 映像自我测试失败时重启设备，此时引导加载程序擦除无效映像来拒绝该映像，并执行之前有效的映像。

设备只能有一个有效的映像。其他映像可以是新 OTA 映像或等待提交（自我测试）。OTA 更新成功后，将从设备上擦除旧映像。


| 状态 | 值 | 描述 | 
| --- | --- | --- | 
|  新映像  |  0xFF  |  应用程序映像是新的，从未执行。  | 
|  等待提交  |  0xFE  |  标记应用程序映像供测试执行。  | 
|  有效  |  0xFC  |  应用程序映像标记为有效且已提交。  | 
|  无效  |  0xF8  |  应用程序映像标记为无效。  | 

## 映像描述符
<a name="image-descriptor"></a>

闪存设备上的应用程序映像必须在映像标头之后包含映像描述符。映像描述符由构建后实用工具生成，该实用工具使用配置文件 (`ota-descriptor.config`) 生成相应的描述符并添加到应用程序二进制文件前面。此构建后步骤的输出是可用于 OTA 的二进制映像。


| 描述符字段 | 大小（字节） | 
| --- | --- | 
|  序列号  |  4 字节  | 
|  开始地址  |  4 字节  | 
|  结束地址  |  4 字节  | 
|  执行地址  |  4 字节  | 
|  硬件 ID  |  4 字节  | 
|  预留  |  4 字节  | 

**序列号**  
序列号必须在生成新 OTA 映像之前递增。请参阅 `ota-descriptor.config` 文件。启动加载程序使用此编号来确定要启动的映像。有效值介于 1 到 4294967295 之间。

**开始地址**  
设备上应用程序映像的开始地址。由于映像描述符附加到应用程序二进制文件的前面，此地址是映像描述符的开头。

**结束地址**  
设备上应用程序映像的结束地址，不包括映像的后缀部分。

**执行地址**  
映像的执行地址。

**硬件 ID**  
启动加载程序用于验证为正确的平台生成了 OTA 映像的唯一硬件 ID。

**预留**  
此项保留供将来使用。

## 映像后缀
<a name="image-trailer"></a>

映像后缀附加到应用程序二进制文件。其中包含签名类型字符串、签名大小和映像的签名。


| 后缀字段 | 大小（字节） | 
| --- | --- | 
|  签名类型  |  32 字节  | 
|  签名大小  |  4 字节  | 
|  Signature  |  256 字节  | 

**签名类型**  
签名类型是一个字符串，表示使用的加密算法，并用作后缀的标记。启动加载程序支持椭圆曲线数字签名算法 (ECDSA)。默认值为 sig-sha256-ecdsa。

**签名大小**  
加密签名的大小，以字节为单位。

**Signature**  
随映像描述符一起附加的应用程序二进制文件加密签名。

## 启动加载程序配置
<a name="bootloader-configuration"></a>

基本启动加载程序配置选项在 `freertos/vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/aws_boot_config.h` 中提供。一些选项仅提供用于调试目的。

**启用默认启动**  
从默认地址启用应用程序的执行，并且只能为调试启用。映像从默认地址执行而不经过任何验证。

**启用加密签名验证**  
在启动时启用加密签名验证。失败的映像从设备中擦除。此选项仅提供用于调试用途，并且必须在生产中保持启用。

**擦除无效映像**  
如果库上的映像验证失败，则启用该库的完整擦除。此选项仅提供用于调试，并且必须在生产中保持启用。

**启用硬件 ID 验证**  
对在 OTA 映像描述符中的硬件 ID 以及在启动加载程序内编程的硬件 ID 启用验证。此项可选，如果无需硬件 ID 验证，则可以禁用。

**启用地址验证**  
在 OTA 映像的描述符中启用开始地址、结束地址和执行地址的验证。建议您保持启用此选项。

## 构建启动加载程序
<a name="building-bootloader"></a>

该演示引导加载程序作为可加载项目，包含在位于 FreeRTOS 源代码存储库的 `freertos/vendors/microchip/boards/curiosity_pic32mzef/aws_demos/mplab/` 中的 `aws_demos` 项目中。生成 `aws_demos` 项目时，它先生成引导加载程序，然后生成应用程序。最终输出是一个统一的十六进制映像，包括启动加载程序和应用程序。提供 `factory_image_generator.py` 实用程序用于生成具有加密签名的统一十六进制映像。启动加载程序实用程序脚本位于 `freertos/demos/ota/bootloader/utility/` 中。

### 启动加载程序构建前步骤
<a name="bootloader-pre-build"></a>

此构建前步骤执行名为 `codesigner_cert_utility.py` 的实用工具脚本，该脚本从代码签名证书中提取公有密钥，并生成包含采用抽象语法表示法 1 (ASN.1) 编码格式公有密钥的 C 标头文件。此标头编译到启动加载程序项目中。生成的标头包含两个常量：公有密钥以及密钥长度的数组。也可以不带 `aws_demos` 生成启动加载程序项目，并作为普通应用程序进行调试。