A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/bootloader.html below:

Website Navigation


å¼•å¯¼åŠ è½½ç¨‹åº (Bootloader) - ESP32

引导加载程序 (Bootloader)

[English]

ESP-IDF 二级引导加载程序 (second stage bootloader) 主要执行以下任务:

  1. 内部模块的最小化初始配置;

  2. 如果配置了 flash 加密 和/或 Secure Boot,则对其进行初始化。

  3. 根据分区表和 ota_data(如果存在)选择需要引导的应用程序 (app) 分区;

  4. 将此应用程序镜像加载到 RAM(IRAM 和 DRAM)中,最后把控制权转交给此应用程序。

ESP-IDF 二级引导加载程序位于 flash 的 0x1000 偏移地址处。

如需了解包括 ESP-IDF 二级引导加载程序在内的完整启动过程,请参考 应用程序的启动流程。

引导加载程序兼容性

建议使用最新发布的 ESP-IDF 版本。OTA(空中升级)更新可以在现场烧录新的应用程序,但不能烧录一个新的引导加载程序。因此,引导加载程序支持引导从 ESP-IDF 新版本中构建的应用程序。

但不支持引导从 ESP-IDF 旧版本中构建的程序。如果现有产品可能需要将应用程序降级到旧版本,那么在手动更新 ESP-IDF 时,请继续使用旧版本引导加载程序的二进制文件。

备注

如果在生产中测试现有产品的 OTA 更新,请确保测试中使用的引导加载程序二进制文件与生产中部署的相同。

ESP-IDF V2.1 之前的版本

与新版本相比,ESP-IDF V2.1 之前的版本构建的引导加载程序对硬件的配置更少。使用这些早期 ESP-IDF 版本的引导加载程序并构建新应用程序时,请启用配置选项 CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS。

ESP-IDF V3.1 之前的版本

ESP-IDF V3.1 之前的版本构建的引导加载程序不支持分区表二进制文件中的 MD5 校验。使用这些 ESP-IDF 版本的引导加载程序并构建新应用程序时,请启用配置选项 CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS。

ESP-IDF V5.1 之前的版本

ESP-IDF V5.1 之前的版本构建的引导加载程序不支持 CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM。使用这些 ESP-IDF 版本的引导加载程序并构建新应用程序时,不应使用该选项。

配置 SPI flash

每个 ESP-IDF 应用程序或引导加载程序的二进制文件中都包含一个文件头,其中内置了 CONFIG_ESPTOOLPY_FLASHMODE、CONFIG_ESPTOOLPY_FLASHFREQ、和 CONFIG_ESPTOOLPY_FLASHSIZE。这些是用于在启动时配置 SPI flash。

一级 (ROM) 引导加载程序 从 flash 中读取 二级引导加载程序 文件头中的配置信息,并使用这些信息来加载剩余的 二级引导加载程序。然而,此时系统的时钟速度低于其被配置的速度,并且在这个阶段,只支持部分 flash 模式。因此,当 二级引导加载程序 运行时,它会从当前应用程序的二进制文件头中读取数据(而不是从 二级引导加载程序 的文件头中读取数据),并使用这些数据重新配置 flash。这样的配置流程可让 OTA 更新去更改当前使用的 SPI flash 的配置。

ESP-IDF V4.0 版本之前的引导加载程序使用其自身的文件头来配置 SPI flash,这意味着无法在 OTA 更新时更改 SPI flash 配置。为了与旧版本的引导加载程序兼容,应用程序在其启动期间使用应用程序文件头中的配置信息重新初始化 flash 配置。

日志级别

引导加载程序日志的级别默认为 "Info"。通过设置 CONFIG_BOOTLOADER_LOG_LEVEL 选项,可以增加或减少这个等级。这个日志级别与应用程序中使用的日志级别是分开的(见 日志库)。

降低引导加载程序日志的详细程度可以稍微缩短整个项目的启动时间。

恢复出厂设置

在更新出现问题时,最好能有一种方法让设备回到已知的正常状态,这时可选择恢复出厂设置。

要回到原始出厂设置并清除所有用户设置,请在引导加载程序中配置 CONFIG_BOOTLOADER_FACTORY_RESET。

以下两种方式可以将设备恢复出厂设置。

这两个配置选项都可以独立启用。

此外,以下配置选项用于配置触发恢复出厂设置的条件:

如果应用程序需要知道设备是否触发了出厂重置,可以通过调用 bootloader_common_get_rtc_retain_mem_factory_reset_state() 函数来确定:

同时需要注意该功能需要占用部分 RTC FAST 内存(占用的内存与 CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP 大小相同)。

从测试固件启动

用户可以编写特殊固件用于生产环境中测试,并在需要的时候运行。此时需要在项目分区表中专门申请一块分区用于保存该测试固件,其类型为 app,子类型为 test(详情请参考 分区表)。

实现该测试应用固件需要为测试应用创建一个完全独立的 ESP-IDF 项目(ESP-IDF 中的每个项目仅构建一个应用)。该测试应用可以独立于主项目进行开发和测试,然后在生成测试时作为一个预编译 .bin 文件集成到主项目的测试应用程序分区的地址。

要在主项目的引导加载程序中支持这个功能,请设置 CONFIG_BOOTLOADER_APP_TEST 并配置以下三个选项:

回滚

回滚和反回滚功能也必须在引导加载程序中配置。

请参考 OTA API 参考文档 中的 应用程序回滚 和 防回滚 章节。

看门狗

芯片配备两组看门狗定时器:主系统看门狗定时器 (MWDT_WDT) 和 RTC 看门狗定时器 (RTC_WDT)。芯片上电时,两组看门狗定时器都会被启用,但在引导加载程序中,两组看门狗定时器都会被禁用。设置 CONFIG_BOOTLOADER_WDT_ENABLE (默认设置)可以重新启用 RTC 看门狗定时器,用于跟踪从启用引导加载程序到调用用户主函数的时间。此期间内 RTC 看门狗定时器始终可用,并且如果在 9 秒内没有应用程序成功启动,则 RTC 看门狗定时器会自动重置芯片。这一功能可以有效防止启动过程中由于电源不稳定而导致的死机。

引导加载程序大小

当需要启用额外的引导加载程序功能,包括 flash 加密 或安全启动,尤其是设置高级别 CONFIG_BOOTLOADER_LOG_LEVEL 时,监控引导加载程序 .bin 文件的大小变得非常重要。

当使用默认的 CONFIG_PARTITION_TABLE_OFFSET 值 0x8000 时,二进制文件最大可为 0x8000 字节。

如果引导加载程序二进制文件过大,则引导加载程序会构建将失败并显示 "Bootloader binary size [..] is too large for partition table offset" 的错误。如果此二进制文件已经被烧录,那么 ESP32 将无法启动 - 日志中将记录无效分区表或无效引导加载程序校验和的错误。

可以使用如下方法解决此问题:

当启用 Secure Boot V2 时,由于引导加载程序最先加载到固定大小的缓冲区中进行验证,对二进制文件大小的绝对限制为 48 KB (0xC000 字节)(不包括 4 KB 签名)。

从深度睡眠中快速启动

引导加载程序有 CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP 选项,可以减少从深度睡眠中唤醒的时间(有利于降低功耗)。当 CONFIG_SECURE_BOOT 选项禁用时,该选项可用。由于无需镜像校验,唤醒时间减少。

在第一次启动时,引导加载程序将启动的应用程序的地址存储在 RTC FAST 存储器中。而在唤醒过程中,这个地址用于启动而无需任何检查,从而实现了快速加载。

自定义引导加载程序

用户可以扩展或修改当前的引导加载程序,具体有两种方法:使用钩子实现或重写覆盖当前程序。这两种方法在 ESP-IDF 示例的 custom_bootloader 文件夹中都有呈现。

在引导加载程序的代码中,不能使用其他组件提供的驱动和函数,除非某个驱动或函数明确声明支持在引导加载程序中运行。如果确实需要,请将所需功能放在项目的 bootloader_components 目录中(注意,这会增加引导加载程序的大小)。以下是可以在引导加载程序中使用的组件示例:

如果引导加载程序过大,则可能与内存中的分区表重叠,分区表默认烧录在偏移量 0x8000 处。增加 分区表偏移量 ,将分区表放在 flash 中靠后的区域,这样可以增加引导加载程序的可用空间。


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4