升级功能对于所有的嵌入式产品都是非常重要的。尤其是当产品量产/销售阶段,已经没有条件让厂家对产品升级,因此升级方式的设计必须防呆防错以及稳定。

乐鑫ESP32作为蓝牙WIFI合一的物联网芯片,开发成产品后势必会使用OTA方式进行升级。本文档对ESP32的Flash分区配置情况以及SDK提供的OTA Demo进行简要分析,并以此作为未来产品OTA流程设计的参考。

本文档只分析SDKOTA Demo的升级流程,不涉及过于具体的Flash操作,具体问题在实际开发过程中再做处理。

1:ESP32 Flash空间分区情况

1.1ESP32 Flash空间分区配置

目前使用的ESP-WROOM-32集成4MB SPI Flash。在编译esp32程序时,通过make menuconfig -> PartitionTable 可以有三种分区选择:工厂程序(无OTA分区)/工厂程序(双OTA分区)/用户自定义分区。

menuconfig中的配置只是修改配置文件中的宏,实际上ESP32 SDK对应Flash分区配置的源码路径是:

\esp-idf-v3.0-rc1\components\partition_table

该路径下有文件partitions_singleapp/partitions_singleapp_coredump/partitions_two_ota/partitions_two_ota_coredump都是用来对Flash分区进行配置的。

这里以最为复杂的partitions_two_ota_coredump为例,再参考部分代码,可以得知使用partitions_two_ota_coredump配置分区时4M SPI Flash的分区情况:

分区用处需要特殊说明的是:

<1>core dump分区:core dump分区用于查找系统崩溃时的软件错误,简单的说就是软件崩溃的时候会刷写调试信息到Flash保存(掉电不丢失)以便于开发者分析。关于这个分区的使用有博客:《使用ESP32 的调试工具 coredump》

https://blog.csdn.net/tidyjiang/article/details/72123346

可见core dump分区在实际开发产品时比较有用,需要保留。

<2>Factory App分区:出厂时的主程序存储区

<3>OTA data/OTA_0/OTA_1与OTA升级功能相关,后面再做叙述。

1.2 自定义ESP32 Flash分区配置

对于产品开发而言,需要进行Flash分区自定义配置以满足需求。简单的说,至少core dump分区,OTA相关分区,以及掉电需要保存的用户数据区都是必要的。

现在在1.1节 partitions_two_ota_coredump的基础上进行自定义Flash分区配置,在core dump分区后面加上128K user data分区用于保存用户数据,方法如下:

<1>makemenuconfig -> Partition Table -> Custom partition table CSV

选择后会要求输入自定义的分区配置csv文件名,例如填入partition.csv。

<2>从路径\esp-idf-v3.0-rc1\components\partition_table下拷贝一个分区配置文件,使用写字板修改,例如添加128K user data分区:

<3>将新编辑好的partition.csv分区配置文件拷到用户的App目录下,make即可。

<4>烧录编译好的固件后,从调试信息看,Flash分区已经变更完成。用户需要掉电保存的数据可以通过nvs api(nvs_open_from_partition)写入到user data区。(暂时未测试)

2:ESP32 SDK OTA Demo升级流程

ESP32SDK路径\esp-idf-v3.0-rc1\examples\system\ota是官方提供的OTA Demo,并且有OTA升级流程图(使用说明):

但是很显然这对于嵌入式开发而言没有太大参考意义。

ESP32SDK OTA Demo部分代码目前未经调试测试,因此不保证分析完全正确,有谬误再做更改。

2.1 ESP32 SDK OTA Demo升级策略

升级策略分为两个部分讨论:1:升级目标固件的获取与烧录;2:OTA升级策略。后者是关键。

2.1.1升级目标固件的获取与烧录

升级固件的获取与写入非常简单:ESP32连接HTTP服务器;发送请求Get升级固件;每次读取1KB固件数据;写入Flash。嵌入式设备的升级流程基本都是类似的。

期间出现异常的处理是停止升级,指针原地跳转。

2.1.2 OTA升级策略

OTA升级策略是关键的。欠缺考虑的升级策略会坑死开发人员,更因为终端用户非专业人士,缺乏防呆防错的升级策略经常会使产品升级失败变砖,投诉与赔偿在所难免(手动笑脸)。

刨去繁琐的代码,简述ESP32SDK OTA Demo的升级策略如下:ESP32 SPI Flash内有与升级相关的(至少)四个分区:OTA data、Factory App、OTA_0、OTA_1。其中FactoryApp内存有出厂时的默认固件。

首次进行OTA升级时,OTA Demo向OTA_0分区烧录目标固件,并在烧录完成后,更新OTA data分区数据并重启。系统重启时获取OTA data分区数据进行计算,决定此后加载OTA_0分区的固件执行(而不是默认的Factory App分区内的固件),从而实现升级。

同理,若某次升级后ESP32已经在执行OTA_0内的固件,此时再升级时OTA Demo就会向OTA_1分区写入目标固件。再次启动后,执行OTA_1分区实现升级。以此类推。

升级的目标固件始终在OTA_0 OTA_1两个分区之间交互烧录,不会影响到出厂时的Factory App固件。

2.2 ESP32 SDK OTA Demo API简略说明

根据2.1.2对OTA Demo升级策略的描述,这里罗列一下相关的重要函数接口,但不做仔细分析。具体问题待开发过程中出现时再做处理:

<1>源码路径:\esp-idf-v3.0-rc1\examples\system\ota\main\ota_example_main.c

esp_ota_get_boot_partition:

esp_ota_get_running_partition:

获取当前系统执行的固件所在的Flash分区(两者区别暂时未理解)

esp_ota_get_next_update_partition:

获取当前系统下一个(紧邻当前使用的OTA_X分区)可用于烧录升级固件的Flash分区

esp_ota_begin& esp_ota_write & esp_ota_end:

向可用的Flash分区(一般是OTA_X分区)刷入升级目标固件

esp_ota_set_boot_partition:

升级完成更新OTA data区数据,重启时根据OTA data区数据到Flash分区加载执行目标(新)固件

<2>源码路径:\esp-idf-v3.0-rc1\components\bootloader\subproject\main\ bootloader_start.c

load_partition_table:加载Flash分区表(从分区表找到OTA data区地址)

get_selected_boot_partition:获取Flash启动分区(计算OTA data区数据得到)

load_boot_imageunpack_load_app:从Flash启动分区加载解压固件并执行

2.3 优点与可能的问题

从ESP32 SDKOTA Demo升级策略看,应该是比较稳妥的,无论升级期间出现任何异常,只要OTA data区数据未被修改,设备还可以加载原有的固件执行。

目前看来可能需要考虑的地方有:

<1>是否存在可能,OTA data数据指向了一个升级失败的区,导致设备加载损坏的固件;

<2>因为OTA需要三个升级相关区,因此固件大小被限制在小于SPI Flash Size/3

<3>获取升级目标固件还应当加入防错/重传/校验的机制;出现异常时也应当有相应处理。

<4>留出后台控制接口,用于修改OTA data区,便于远程控制程序运行。

———————————————— 
版权声明:本文为CSDN博主「六文钱」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/abc517789065/article/details/79891568

esp32 Flash分区与OTA功能简析相关推荐

  1. Windows Vista系统自带刻录功能简析

    Windows Vista系统自带刻录功能简析 我们知道Windows XP系统自带CD刻录功能,但遗憾的是功能较简陋,且无法支持DVD刻录.在微软最新推出的Windows Vista操作系统中,自带 ...

  2. esp32 Flash分区

    1.1ESP32 Flash空间分区配置

  3. 基于FPGA的flash分区实现多功能转换(icap核)

    转至:https://blog.csdn.net/Headogerz/article/details/82251621 1.前文提到通过硬件代码描述可以将程序固化到flas中,但是只能实现单一功能,无 ...

  4. android 勿扰代码,Android7.1勿扰功能简析

    Android系统在5.1系统开始增加勿扰模式,渐渐的有着取代静音模式的趋势,最新的系统已经更新到7.1.1,我们来看一下最新的原生勿扰有哪些功能. 首先在屏幕下滑出来的快捷开关界面中,我们可以看到勿 ...

  5. 记录--实时音视频功能简析(live-pusher与live-player)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用须知 2017年下半年,微信6.5.21版本支持在线音视频功能.开发者可以通过两个音视频组件 和 实现实时地在线直播.视频通话.语音通 ...

  6. Android7.1勿扰功能简析

    Android系统在5.1系统开始增加勿扰模式,渐渐的有着取代静音模式的趋势,最新的系统已经更新到7.1.1,我们来看一下最新的原生勿扰有哪些功能. 首先在屏幕下滑出来的快捷开关界面中,我们可以看到勿 ...

  7. OCR文字识别 证件识别功能简析

    OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,技术支持百度搜索OC ...

  8. ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

    ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码) 目录 ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码) 1.OTA技术 简介 2.本章介绍 3 ...

  9. Java中高级核心知识全面解析——Redis(集群【概述{主从复制、哨兵、集群化}、数据分区方案、节点通信机制、数据结构简析】)5

    目录 一.[集群]入门实践教程 1.Redis 集群概述 1)Redis 主从复制 2)Redis 哨兵 3)Redis 集群化 2.主从复制 1)主从复制主要的作用 2)快速体验 ①.第一步:本地启 ...

最新文章

  1. Unity完全学习教程-从初学者到C#中的RPG游戏开发
  2. 深度学习入门课程学习笔记06 反向传播
  3. 总结ThinkPHP使用技巧经验分享(四)
  4. H3C交换机引发的奇葩故障
  5. Solo 博客系统 1.7.0 发布 - 新版 MD 编辑器
  6. sentinel 官方文档_SpringCloud网关聚合Swagger接口文档实践
  7. 深度学习模型保存_Web服务部署深度学习模型
  8. 14.grafana导入导出;Grafana的安装和Influxdb数据源配置
  9. 五个简单的原则,带你写出整洁代码
  10. IDEA无法通过类加载器获取resources文件夹配置文件解决办法
  11. 英国电信公司沃达丰遭到网络攻击
  12. 难过的要命。。。。。。
  13. android 获取键盘回车键事件,设置软键盘回车键显示内容,点击空白处隐藏软键盘
  14. 数百万的 Android 手机预装了危险的恶意软件!
  15. python数据获取及预处理_python数据预处理(入门)
  16. Day11 - 使用正则表达式
  17. 让OSX terminal更出彩
  18. vue 编写H5项目使用BScroll “better-scroll“;两边都滚动,并且联系
  19. C/C++编程:.msi文件和.exe文件的区别
  20. 华芯微特SWM220R8T7-LQ64-22100最小系统板测试版开发板面包板

热门文章

  1. 22考研清华深研院电子与通信,985信号与系统400+高分经验分享
  2. java基本微信小程序的琴房预约管理系统 uniapp 小程序
  3. 【100%通过率 】华为OD真题c++/java/python【完美走位】【 2022 Q4 | 100分】
  4. 王者荣耀刷金币小程序
  5. Excel中序号自动填充
  6. 后台Base64解码图片变小的坑
  7. 含泪赔了近200万,我终于明白不是什么人都能干电商的……
  8. 刷牙也有如此强大的“黑科技”?------艾优电动牙刷深度体验
  9. 简单的将linux二进制程序、资源打包成rpm
  10. redis主从配置及主从切换