ESP32 分区表

当你编译程序,发现 app partition is too small for binary 错误的时候,就涉及到 ESP32 分区表的内容了。

一、基本概念

在了解分区之前,先了解一下以下概率,便于 ESPe32 分区的理解

  1. 缓存(cache)
    缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。而缓存分为:一级缓存、二级缓存、三级缓存,原理如下图所示:

    从图中可以看出,为了减少争用Cache所造成的冲突,提高了处理器效能,将一级缓存分为:数据缓存(Data Cache,D-Cache)和指令缓存(Instruction Cache,I-Cache),想要了解更多信息,参考缓存

  2. 随机存取存储器(RAM)
    随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。根据存储单元的工作原理不同, RAM分为静态SRAM和动态DRAM

    • SRAM
      优点:速度快、使用简单、不需刷新、静态功耗极低;常用作Cache。 [8]
      缺点:元件数多、集成度低、运行功耗大。
    • DRAM
      优点: 集成度远高于SRAM、功耗低,价格也低。 [8]
      缺点:因需刷新而使外围电路复杂;刷新也使存取速度较SRAM慢,所以在计算机中,DRAM常用于作主存储器。

    了解更多,请参考随机存取存储器

  3. 只读存储器(ROM)
    只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。

    ROM有多种类型,且每种只读存储器都有各自的特性和适用范围。从其制造工艺和功能上分,ROM有五种类型,即掩膜编程的只读存储器MROM(Mask-programmedROM)、可编程的只读存储器PROM(Programmable ROM)、可擦除可编程的只读存储器EPROM(Erasable Programmable ROM)、可电擦除可编程的只读存储器 EEPROM(Elecrically Erasable Programmable ROM)和快擦除读写存储器(Flash Memory)。
    了解更多,请参考只读存储器

  4. 闪存(Flash)
    flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失。

  5. 电磁频率(RadioFrequency)
    RF 是Radio Frequency的缩写,表示可以辐射到空间的电磁频率,频率范围从300KHz~30GHz之间。

  6. 实时时钟(RTC)
    实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路,通常称为时钟芯片。

  7. 安全系统(Security)
    主要是各种安全算法,确保系统和数据的安全

了解完成后上面的基本概念后,我们在看一下ESP32 的架构就很容易了,如下图所示:

二、芯片配置

分区配置需要根据自己芯片的 Flash 大小进行配置的,所以在配置之前首先得了解自己芯片的信息,如下图所示:

三、选择分区方式

  1. 设置 flash 大小,并选择分区方式

    注意:这个可以主要可以分为两种配置方式,除自定义(Custom partition table CSV)分区方式外,其他的都是预定义分区,主要分析自定义分区方式

  2. 设置自定义分区

  3. 在工程文件中创建 partitions.csv 文件,如下图所示:

  4. partitions.csv 文件中添加自定义分区内容

    # 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,  4M,
    

三、分区类容

# 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,    ,         1M
ota_1,    app,  ota_1,    ,         1M
nvs_key,  data, nvs_keys, ,        0x1000

  • 字段之间的空格会被忽略,任何以 # 开头的行(注释)也会被忽略。
  • CSV 文件中的每个非注释行均为一个分区定义。
  • 每个分区的 Offset 字段可以为空,gen_esp32part.py 工具会从分区表位置的后面开始自动计算并填充该分区的偏移
    地址,同时确保每个分区的偏移地址正确对齐。

Name字段

Name 字段可以是任何有意义的名称,但不能超过 16 个字符(之后的内容将被截断)。该字段对 ESP32-S3 并不是特别重要。

Type 字段

Type 字段可以指定为 app (0x00) 或者 data (0x01),也可以直接使用数字 0-254(或者十六进制 0x00-0xFE)。注意,0x00-0x3F 不得使用(预留给 esp-idf 的核心功能)。

注意:启动加载器将忽略 app (0x00) 和 data (0x01) 以外的其他分区类型。

SubType 字段

  • 当 Type 定义为 app 时,SubType 字段可以指定为 factory (0x00)、 ota_0 (0x10) … ota_15 (0x1F) 或者 test (0x20)。
  • 当 Type 定义为 data 时,SubType 字段可以指定为 ota (0x00)、phy (0x01)、nvs (0x02)、nvs_keys (0x04) 或者其他组件特定的子类型

Offset 字段

Offset(偏移地址) 为空时,则会紧跟着前一个分区之后开始;若为首个分区,则将紧跟着分区表开始。
注意:app 分区的偏移地址必须要与 0x10000 (64K) 对齐

Size 字段

分区的大小

Flags字段

当前仅支持 encrypted 标记。如果 Flags 字段设置为 encrypted,且已启用 Flash 加密 功能,则该分区将会被加密。

详细见 ESP-IDF 编程指南

配置完成后,在编译过程中会打印 分区配置表的信息,如下所示:

*******************************************************************************
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,16K,
otadata,data,ota,0xd000,8K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,4M,
*******************************************************************************

参考文献

缓存:https://baike.baidu.com/item/缓存/100710?fr=aladdin
随机存取存储器:https://baike.baidu.com/item/随机存取存储器/4099402
只读存储器:https://baike.baidu.com/item/只读存储器/2399075
RF:https://baike.baidu.com/item/RF/3756791
实时时钟:https://baike.baidu.com/item/实时时钟/5563907

posted @ 2022-10-14 15:23  浇筑菜鸟  阅读(2637)  评论(0编辑  收藏  举报