Microchip Curiosity PIC32MZEF 的演示启动加载程序 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Microchip Curiosity PIC32MZEF 的演示启动加载程序

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

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

启动加载程序支持 OTA 需要的以下功能:

  • 在设备上维护应用程序映像,并在这些映像之间切换。

  • 允许对收到的 OTA 映像执行自行测试并在出现故障时回退。

  • 检查 OTA 更新映像的签名和版本。

注意

要设置和运行 FreeRTOS 演示,请按照开始使用 FreeRTOS中的步骤操作。

启动加载程序状态

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

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

启动加载程序状态 描述

初始化

启动加载程序处于初始化状态。

验证

启动加载程序正在验证设备上存在的映像。

执行映像

启动加载程序正在启动所选映像。

执行默认映像

启动加载程序正在启动默认映像。

错误

启动加载程序处于出错状态。

在前面的示意图中,Execute ImageExecute Default 都显示为 Execution 状态。

启动加载程序执行状态

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

启动加载程序默认执行状态

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

启动加载程序出错状态

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

闪存设备

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

应用程序映像结构

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

组件 大小(字节)

映像标头

8 字节

映像描述符

24 字节

应用程序二进制文件

< 1 MB - (324)

Trailer

292 字节

映像标头

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

标头字段 大小(字节)

幻码

7 字节

映像标志

1 字节

幻码

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

映像标志

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

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

状态 描述

新映像

0xFF

应用程序映像是新的,从未执行。

等待提交

0xFE

标记应用程序映像供测试执行。

有效

0xFC

应用程序映像标记为有效且已提交。

无效

0xF8

应用程序映像标记为无效。

映像描述符

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

描述符字段 大小(字节)

序列号

4 字节

开始地址

4 字节

结束地址

4 字节

执行地址

4 字节

硬件 ID

4 字节

预留

4 字节

序列号

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

开始地址

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

结束地址

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

执行地址

映像的执行地址。

硬件 ID

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

预留

此项保留供将来使用。

映像后缀

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

后缀字段 大小(字节)

签名类型

32 字节

签名大小

4 字节

签名

256 字节

签名类型

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

签名大小

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

签名

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

启动加载程序配置

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

启用默认启动

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

启用加密签名验证

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

擦除无效映像

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

启用硬件 ID 验证

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

启用地址验证

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

构建启动加载程序

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

启动加载程序构建前步骤

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