esp: ota
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应用程序分区。
注意:按照上图OTA应用分区划分,固件最大大小为1 MB。
Bootloader
Bootloader 引导加载程序的主要功能如下:
- 内部模块的最小初始化配置
- 如果配置了 flash 加密 或 Secure Boot,则对其进行初始化
- 根据分区表和 ota_data(如果存在)选择需要引导的应用程序(app)分区
- 将应用程序镜像加载到 RAM(即IRAM 和 DRAM)中,最后把控制权转交给应用程序。
Bootloader 引导加载程序位于 flash 的 0x1000 偏移地址处。
ESP32 从上电到运行 app_mian()
函数所经历的步骤:
- 一级引导程序被固化在ESP32内部的ROM中,它会从 flash 的
0x1000
偏移地址处加载二级引导程序 至 RAM(即 IRAM & DRAM)中。 - 二级引导程序 从flash 中加载 分区表 和 Bootloader 引导加载程序 至内存中,主程序中包含了 RAM 段和 通过 flash 高速缓存映射的只读段。
- 应用程序启动阶段 运行,这是第二个 CPU 和 RTOS 调度器启动,接着运行
mian_task()
,从而执行app_mian()
。
二级引导程序默认从 flash 的 0x8000
偏移地址处读取分区表。二级引导程序会寻找 工厂应用分区 和 OTA 应用程序分区,二级引导加载程序先查询 otadata
数据分区以确认应引导哪个应用分区 。