这是描述信息

乐鑫官网乐鑫信息科技ESP32-C3wifi模组固件OTA升级原理功能

乐鑫官网乐鑫信息科技ESP32-C3wifi模组固件OTA升级原理功能

乐鑫官网乐鑫信息科技ESP32-C3wifi模组固件OTA升级原理功能

乐鑫官网乐鑫信息科技ESP32-C3wifi模组固件OTA升级原理功能

乐鑫官网乐鑫信息科技ESP32-C3wifi模组固件OTA升级原理功能

乐鑫官网乐鑫信息科技ESP32-C3wifi模组固件OTA升级原理功能,前面介绍了分区表的个条目起始地址为 0x9000,为什么不是 0x0 这个地址呢? 又为什么是 0x9000 呢? Flash 被分为了 8个区域,0x00 地址存放了 Bootloader (启动加载程储的具体内容。序),0x8000 存放了分区表,后面6个就很熟悉了,从0x9000 开始便是分区表所划分的区域。现在我们可以回答第一个问题了,因为 0x0 地址存放了 Botloader 程序(并非所有芯片 Flash 的 0x0 地址都存放着 Bootloader。乐鑫官网乐鑫信息科技ESP32-C3wifi模组系列芯片的 Bootloader 存放在 0x1000 地址处),它用于加载并引导应用分区。在乐鑫科技的芯片程序设计中,Bootloader 被称为二级导程序,其主要作用为增加 Flash 分区的灵活性,并且方便实现 Flash 加密、安全引导和OT升级 等功能。二级引导程序默认从 Flash 的 0x8000 偏移地址处加载分区表,分区表的大小头0x1000,二级引导程序会从分区表中寻找出厂应用分区和 OTA 升级数据分区,并通过查询OTA 升级数据分区来确定引导哪个分区,现在第 2 个问题也找到了答案。


乐鑫官网乐鑫信息科技ESP32-C3wifi模组从上电到运行 app_main()函数的过程可以分为如下 3 个步骤:
(1)由一级引导程序进行引导。一级引导程序被固化在了 ESP32-C3 内部的 ROM 中,芯片复位后,CPU 会立即开始运行,判断启动模式并执行相关操作,从 Flash 的 0x0 偏移地址处将二级引导程序加载到 RAM 中。
(2) 由二级引导程序进行引导。二级引导程序将首先从 Flash 中加载分区表,然后查询 OTA升级数据分区,并选择某个应用分区的固件进行加载。当处理完所有数据后,二级引导程序将校验固件的完整性,并从二进制固件文件的头部寻找入口地址,跳转到该地址处运行。应用分区的固件拥有一些状态,这些状态会影响固件的启动。这些状态保存在 OTA 升级数据分区,在乐鑫官网乐鑫信息科技ESP32-C3wifi模组ESP-IDF 中由一组枚举变量 (esp_ota_img_states_t) 定义。
1)新固件:由ESP_OTA_IMG_NEW定义,标记固件是否为第一次被 Bootloader 加载。在引导加载程序中,此状态更改为 ESP_OTA_IMG_PENDING_VERIEY。
2) 待校验的固件:由ESP_OTA_IMG_PENDING_VERIEY定义,标记固件是否被启用。如果第二次启动时仍然为此状态,则它将被更改为 ESP_OTA_IMG_ABORTED。 
3)有效固件:由 ESP_OTA_IMG_VALID定义,标记固件能够正常运行。一旦被标识为该状态,此固件能够无限制启动。
4)无效固件: 由 ESP_OTA_IMG_INVALID 定义,标记固件无法正常运行。一旦被标识为该状态,此固件将无法再次被启动。
5)异常固件:由 ESP_TAIME_ABORTED 定义,标记件存在异常。一旦被标为该状态,此固件将无法再次被启动。
6)不明确的固件:由ESP_OTA_IMS_UMDSFINED 定义,若标记固件状态为不明确,则该因固件能够无限制启动。
(3)应用程序启动阶段。二级引导程序跳转后便是应用固件的启动阶段,该阶段包含了从应围程序开始执行到 app_main()函数创建运行前的所有过程。乐鑫官网乐鑫信息科技ESP32-C3wifi模组可分为三个部分:
1)硬件和基本端口的初始化。
2)软件服务和 FreeRTOS 系统的初始化。
3)运行主任务并调用 app_main()函数。


OTA 升级原理概述


物联网设备进行 OTA 升级的第一步是获取新固件。获取新固件的方式有很多,使用 Wi-Fi 获取是其中较为简单、方便的一种方式。物联网设备可以通过 Wi-Fi 连接到路由器,进而连接到OTA 升级服务器,通过一些应用层协议 (如 HTTP、FTP) 下载固件。乐鑫官网乐鑫信息科技ESP32-C3wifi模组将介绍一种通过HTTPS 下载固件的方式,这里我们以 advanced_https_ota (esp-idf/examples/system/ota/advanced_https_ota)为示例,该示例使用 esp_https_ota 组件完成OTA 升级,该组件使用的下载协议为 HTTPS。


(1)固件获取。上述代码使用 HTTPS 协议完成了固件的下载,ESP-IDF 对 HTTPS 操作进行了封装。仅需配置 esp_http_client_config_t 结构体即可,在该结构体中可以传递证书并启用 TLS 协议来保护传输的数据安全。在完成 HTTPS 连接参数配置后,乐鑫官网乐鑫信息科技ESP32-C3wifi模组需要将填写的配置传递给 esp_https_ota_config_t 结构体,该结构体提供了一个回调函数,方便设置 HTTPS 请求头部信息(Request Header)。头部信息一般用于向服务器端声明HTTPSBody 的长度、数据格式等。在完成配置后就可以调用 esp_https_ota_begin()函数进行连接了,该函数将根据HTTPS 返回的状态码(HTTPS Status Code)判断结果。当完成HTTPS连接后,后续就可以循环调用 esp_https_ota_perform ()函数请求固件。
(2) 固件写入。Esp_https_ota_perform()函数将不断向服务器端发送请求信息,并将每一次服务器端返回的数据写入设备的 Flash 中,写入过程是在该函数内部通过调用esp_ota_write()函数实现的。
(3)固件校验。考虑到接收设备的资源有限、网络环境不一定理想等情况,有时往往需要多次发送 HTTPS 请求才能完整地下载固件,乐鑫官网乐鑫信息科技ESP32-C3wifi模组ESP-IDF 提供了 esp_https_ota_iscomplete_data_ received ()函数,该函数可通过计算固件的大小来判断是否完整接收了固件。一旦完整接收了固件,就调用 esp_https_ota_finish()函数结束 HTTPS 连接释放所占用的资源。仅仅通过对比固件大小是否一致来判断固件是否有效是不完善的,我们还需要校验固件的 SHA-256 值来确保下载的固件与原固件是完全一致的,调用函数esp_https_ota_finish()可自动完成校验工作。
(4) 固件切换。Esp_https_ota_finish()函数不仅会释放 HTTPS 资源和校验固件,还会在校验成功后自动改写 OTA 升级数据分区,并同时将本次下载固件的状态更新为不明确固件 (ESP_OTA_IMG_UNDEFINED)。在一切准备工作结束后,调用 esp_restart ()函数再此启动的固件就是新固件。此处的不明确固件是指在 Bootloader 未开启回滚时,固件可以无限制启动。


固件版本管理
将不同功能的固件标记为不同版本是方便后期维护的一个重要手段。乐鑫官网乐鑫信息科技ESP32-C3wifi模组ESP-IDF 提供了一些标记字段,可用于标记版本信息,这些字段与回滚/防回滚功能搭配使用可满足大部分版本管控的需求。
11.2.1 固件标记
可供进行编辑的字段有 4 个,分别为 secure version (安全版本号)、project_version (工程版本号)、project_name (工程名称)与App version (应用版本);不可编辑的字段有2个,分别是 idf_ver (ESP-IDF 版本)与 Compile time and date (编译时间与日期)。
(1) secure_version。安全版本号,用于设定芯片的安全版本,安全版本号存储在 eFuse中,多能标记 16 个版本。启用方式如下:
(Top) - Bootloader config
...
...
[*] Enable app rollback support
[*]Enable app anti-rollback support
(0)eFuse secure version of app (NEW)
(16)Size of the eFuse secure version field (NEW)
...
...
(2) project_version。工程版本号,用于设定工程的版本。启用方式如下:
(Top) - Application manager
...
...
[*] Get the project version from Kconfig
(1)Project version
...
...
(3) project_name。工程名称,在工程目录下的 CMakeLists.txt 文件中进行设置,以advanced_ https_ota 工程为例,启用方式如下:
1.    ...
2.    ...
3.include ($ENV(IDF_PATH)/tools/emake/project.cmake)
4.project (advanced_https_ota)
5.    ...
6.    ...
project(X)为标记的工程名称。

(4) compile time and date (编译时间和日期)与 idf_ver (ESP-IDF 版本)将在编译时自动赋值,从 Log 中可看到下述如下内容:
...
...
(304)Cpu_start: Coplile time:    Mar 14 2022 18:44:
(316)Cpu_start: ESP-IDF: v4.


安全版本号与工程版本号都可以用于标记固件版本信息,但它们的侧重点与实现方式不同。安全版本号写入乐鑫官网乐鑫信息科技ESP32-C3wifi模组芯片的 eFuse 中,一旦写入便不可被更改,该芯片之后只允许写入更高版本号的固件,这种特性可以安全有效地管控重要的更新。重要的更新一般与安全相关,所以称为安全版本号。工程版本号跟随固件存放在 Flash 中,可以在每次编译时随意更改,设备更新时不主动检查该信息,使用方式完全由开发者决定。在实际的开发应用中,因为安全版本号有使用次数限制,一般将提升安全版本号定义为包含了重要功能更新、修复了安全漏洞,将提升工程版本号作为业务层面功能更新使用。


回滚与防回滚功能


应用程序回滚的主要目的是确保设备在更新后一旦发生异常能够及时回退到上一个版本,不影响设备的正常使用。在启用回滚功能时,当校验固件完成后此固件将被标记为新固件(ESP_OTA_IMG_NEW),乐鑫官网乐鑫信息科技ESP32-C3wifi模组在重启时 Bootloader 将选择该固件并将其重新标记为待校验(ESP_OTA_IMG_PENDING_VERIEY),在运行 app_main()函数时可能出现以下两种情况:

1)应用程序运行正常。开发者自测确定功能一切正常,由开发者调用 esp_ota_mark_app_valid_cancel_rollback() 函数将正在运行的固件状态标记为有效固件 (ESP_OTA_IMG_VALID),该固件随后便可无限制启动。
2)应用程序出现严重错误。因为异常导致自动二次重启,这种情况 Bootloader 会直接将该固件标记为异常固件 (ESP_OTA_IMG_ABORTED) 并回滚到上一版本。开发者自测确定功能存在异常,由开发者调用 esp_ota_mark_app_invalid_rollback_and_reboot()函数将正在运行的版本标记为无效固件 (ESP_OTA_IMG_INVALID) 并自动重启回滚到上一版本,该固件随后便无法再启动。


全版本号的另一个作用是防止固件回滚到更低的安全版本号。在 Bootloader 选择可启动的应用程序时,会额外检查安全版本号,只有固件的安全版本号等于或高于芯片 eFuse 中存储的安全版本号,此固件才会被选择,乐鑫官网乐鑫信息科技ESP32-C3wifi模组新的安全版本号将在固件状态被标记为有效固件(ESP_OTA_IMG_VALID) 后被更新。


回滚与防回滚功能都可以通过 menuconfig 启动,启用方式如下:

(Top) - Bootloader config
...
...
[*] Enable app rollback support
[*]Enable app anti-rollback support
(0)eFuse secure version of app (NEW)
(16)Size of the eFuse secure version field (NEW)
...    
...

地址:深圳市宝安区西乡街道麻布社区宝安互联网产业基地A区6栋7栋7706

邮箱:Sales@ferry-semi.com

版权所有©2020  深圳市飞睿科技有限公司  粤ICP备2020098907号    飞睿科技微波雷达wifi模块网站地图