esp: ota

ESP 空中升级(OTA,Over The Air)

ESP 引导加载程序 (Bootloader)

OTA

OTA 升级机制可以让联网设备在固件正常运行时,通过网络(Wi-Fi、以太网、蓝牙)进行固件升级。

在 ESP-IDF 中有两种方式可以进行OTA升级:

  • 使用 app_update 组件提供的本地API。(native_ota_example 示例)
  • 使用 esp_https_ata 组件提供的简化API,它在原生 OTA API的基础上添加了一个抽象层,以便使用HTTPS协议进行升级。(simple_ota_example示例)

ESP32设备运行OTA机制,需要配置设备的分区表:

  • OTA应用程序分区:ota_0 和 ota_1
  • OTA数据分区:otatata

当ESP32设备首次启动时,OTA数据分区中没有数据,引导加载程序就会去启动工厂应用程序。若分区表中没有工厂应用程序,则启动第一个可用的OTA分区(通常是 ota_0)。第一次 OTA升级后,OTA数据分区更新,指定下一次启动哪个 OTA 应用程序分区。

OTA功能启动,向当前未用于启动的OTA引用程序分区写入新的应用固件镜像。镜像验证后,OTA数据分区更新,指定下一次使用该镜像。

第一次OTA升级后,OTA数据分区更新,执行下一次启动哪个OTA应用程序分区。

image-20250101163716070

注意:按照上图OTA应用分区划分,固件最大大小为1 MB。

Bootloader

Bootloader 引导加载程序的主要功能如下:

  • 内部模块的最小初始化配置
  • 如果配置了 flash 加密 或 Secure Boot,则对其进行初始化
  • 根据分区表和 ota_data(如果存在)选择需要引导的应用程序(app)分区
  • 将应用程序镜像加载到 RAM(即IRAM 和 DRAM)中,最后把控制权转交给应用程序。

Bootloader 引导加载程序位于 flash 的 0x1000 偏移地址处。

ESP32 从上电到运行 app_mian() 函数所经历的步骤:

  1. 一级引导程序被固化在ESP32内部的ROM中,它会从 flash 的 0x1000 偏移地址处加载二级引导程序 至 RAM(即 IRAM & DRAM)中。
  2. 二级引导程序 从flash 中加载 分区表 和 Bootloader 引导加载程序 至内存中,主程序中包含了 RAM 段和 通过 flash 高速缓存映射的只读段。
  3. 应用程序启动阶段 运行,这是第二个 CPU 和 RTOS 调度器启动,接着运行 mian_task(),从而执行 app_mian()

二级引导程序默认从 flash 的 0x8000 偏移地址处读取分区表。二级引导程序会寻找 工厂应用分区 和 OTA 应用程序分区,二级引导加载程序先查询 otadata 数据分区以确认应引导哪个应用分区 。