esp32分区表分析总结

esp32分区表分析总结

要点

  • 分区表的首地址是0x8000。
  • 分区若偏移地址为空,则会紧跟着前一个分区之后开始;若为首个分区,则将紧跟着分区表开始。目前根据实际的代码和信息分析,第一个分区默认是从0x9000开始。
  • factory (0x00) 是默认的 app 分区。启动加载器将默认加载该应用程序。但如果存在类型为 data/ota 分区,则启动加载器将加载 data/ota 分区中的数据,进而判断启动哪个 OTA 镜像文件。
  • OTA 升级永远都不会更新 factory 分区中的内容。
  • 如果您希望在 OTA 项目中预留更多 flash,可以删除 factory 分区,转而使用 ota_0 分区
  • app 分区始终会被加密,不管 Flags 字段是否设置。
  • 如果您在项目配置菜单(idf.py menuconfig)中设置了分区表 CSV 文件的名称,然后构建项目或执行 idf.py partition_table。这时,转换将在编译过程中自动完成。
  • idf.py partition_table-flash :使用 esptool.py 工具烧写分区表。
  • idf.py flash :会烧写所有内容,包括分区表。

官方参考: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/partition-tables.html

分区表

如下是Factory app, two OTA definitions 的内容

# ESP-IDF Partition Table
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000,  1M,
ota_0,    app,  ota_0,   0x110000, 1M,
ota_1,    app,  ota_1,   0x210000, 1M,
  • nvs:系统的非易失区,wifi配置,校准数据,以及其他通过api写入的非易失数据在这里。
  • otadata:这个用户存储ota的过程数据,比如当前区标识,完整性,校验等等。
  • phy_init:针对不同PHY的初始配置信息
  • factory:出厂分区,内容是我们的用户代码,我们的程序主体。当ota区有效时,此区会被跳过,默认没有ota时,运行的就是此区,一旦有ota版本,系统会尝试去启动ota的内容。
  • ota_0:第1个ota分区。
  • ota_1:第2个ota分区,无论如何总有一个是当期使用的激活区,另一个作为ota缓存空间用。
  • nvs_key:nvs区的秘钥分区。

    解释

    分区表的长度是0xc00,后面还md5校验,签名等,所以整个内容在 0x1000以内。
    0x9000=0x8000+0x1000
    0xd000=0x9000+0x4000
    0xf000=0xd000+0x2000
    0x10000=0xf000+0x1000
    0x110000=0x10000+0x100000(1M)
    0x210000=0x110000+0x100000(1M)

从上面的计算中,我们就可以看到,偏移地址和容量都是连续的,这也就是为什么实际的分区表,只天容量,不填其实偏移地址,因为地址可以根据容量进行计算得出。

实际例子分析

分区表

# Name,   Type, SubType, Offset,   Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs,      data, nvs,     ,        0x4000,
otadata,  data, ota,     ,        0x2000,
phy_init, data, phy,     ,        0x1000,
ota_0,    app,  ota_0,   ,        0x180000,
ota_1,    app,  ota_1,   ,        0x180000,
fctry,    data, nvs,     ,        0x4000

系统运行日志

I (58) boot: ## Label            Usage          Type ST Offset   Length
I (65) boot:  0 nvs              WiFi data        01 02 00009000 00004000
I (72) boot:  1 otadata          OTA data         01 00 0000d000 00002000
I (80) boot:  2 phy_init         RF data          01 01 0000f000 00001000
I (87) boot:  3 ota_0            OTA app          00 10 00010000 00180000
I (95) boot:  4 ota_1            OTA app          00 11 00190000 00180000
I (102) boot:  5 fctry            WiFi data        01 02 00310000 00004000

从运行日志看,跟我们上面介绍的计算结果一致。

flash工具配置

烧录时的地址配置如下:
file

  • bootloader.bin: 默认从0地址开始。
  • partition-table.bin: 默认起始地址0x8000
  • ota_data_initial.bin: 对应的otadata和phy_init两个分区内容
  • app.bin:对应的是ota_0

从这个例子看,为了节省空间,factory分区被省掉了,直接是ota_0分区。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注