当你编译程序,发现 app partition is too small for binary
错误的时候,就涉及到 ESP32 分区表的内容了。
一、基本概念
在了解分区之前,先了解一下以下概率,便于 ESPe32 分区的理解
-
缓存(cache)
缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。而缓存分为:一级缓存、二级缓存、三级缓存,原理如下图所示:
从图中可以看出,为了减少争用Cache所造成的冲突,提高了处理器效能,将一级缓存分为:数据缓存(Data Cache,D-Cache)和指令缓存(Instruction Cache,I-Cache),想要了解更多信息,参考缓存 -
随机存取存储器(RAM)
随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。根据存储单元的工作原理不同, RAM分为静态SRAM和动态DRAM- SRAM
优点:速度快、使用简单、不需刷新、静态功耗极低;常用作Cache。 [8]
缺点:元件数多、集成度低、运行功耗大。 - DRAM
优点: 集成度远高于SRAM、功耗低,价格也低。 [8]
缺点:因需刷新而使外围电路复杂;刷新也使存取速度较SRAM慢,所以在计算机中,DRAM常用于作主存储器。
了解更多,请参考随机存取存储器。
- SRAM
-
只读存储器(ROM)
只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM有多种类型,且每种只读存储器都有各自的特性和适用范围。从其制造工艺和功能上分,ROM有五种类型,即掩膜编程的只读存储器MROM(Mask-programmedROM)、可编程的只读存储器PROM(Programmable ROM)、可擦除可编程的只读存储器EPROM(Erasable Programmable ROM)、可电擦除可编程的只读存储器 EEPROM(Elecrically Erasable Programmable ROM)和快擦除读写存储器(Flash Memory)。
了解更多,请参考只读存储器 -
闪存(Flash)
flash存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还可以快速读取数据(NVRAM的优势),使数据不会因为断电而丢失。 -
电磁频率(RadioFrequency)
RF 是Radio Frequency的缩写,表示可以辐射到空间的电磁频率,频率范围从300KHz~30GHz之间。 -
实时时钟(RTC)
实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路,通常称为时钟芯片。 -
安全系统(Security)
主要是各种安全算法,确保系统和数据的安全
了解完成后上面的基本概念后,我们在看一下ESP32 的架构就很容易了,如下图所示:
二、芯片配置
分区配置需要根据自己芯片的 Flash 大小进行配置的,所以在配置之前首先得了解自己芯片的信息,如下图所示:
三、选择分区方式
-
设置 flash 大小,并选择分区方式
注意:这个可以主要可以分为两种配置方式,除自定义(Custom partition table CSV)分区方式外,其他的都是预定义分区,主要分析自定义分区方式 -
设置自定义分区
-
在工程文件中创建
partitions.csv
文件,如下图所示:
-
在
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