[ESP32]启动过程与分区表
ESP32启动大概分为三个步骤:
- ESP32内部ROM的引导程序启动,把spi flash是0x1000的bootloader程序加载到RAM中;
- bootloader启动,读取分区表和主应用程序映像
- 主程序运行,启动第二个CPU和RTOS程序。
所以我们简单开发,一般需要烧写三个部分内容即可:
- bootloader
- 分区表
- 主程序
当然一般情况下,bootloader我们是不会修改的,主要是合理的设计分区表。
除了上面三个分区之后,通过还有nvs和phy_init分区:
nvs(non-volatile storate)可以保存一些自定义的数据,类似序列号
phy_init则用来存放一些无线校准参数。
当然,除此之外,如果用到OTA,还会有otadata,ota_0和ota_1这三个分区。
如果使用了spiffs,还会有spiffs分区。
下面给出一个完整的OTA分区表例子,大家可以按照自己需要进行调整:
Name | Type | SubType | Offset | Size | Flags |
---|---|---|---|---|---|
bootloader | bootloader | bootloader | 0x1000 | 0x7000 | |
partition | partition | partition | 0x8000 | 0x1000 | |
nvs | data | nvs | 0x9000 | 0x4000 | |
otadata | data | ota | 0xd000 | 0x2000 | |
phy_init | data | phy | 0xf000 | 0x1000 | |
factory | app | factory | 0x10000 | 0x130000 | |
ota_0 | app | ota_0 | 0x130000 | ||
ota_1 | app | ota_1 | 0x130000 | ||
storage | data | spiffs | 0x60000 |
如果没有修改bootloader,大概分布如下:
nvs:从0x9000开始,长度为0x4000(16KB),若无OTA则为0x6000(24KB)
otadata:从0xd000开始,长度为0x2000(8KB),未使用OTA,则此分区划为nvs
phy_init:从0xf000开始,长度为0x1000(4KB)。
factory或APP:正常的主程序会从0x10000位置开始,这里我的factory,ota_0和ota_1都划分为0x1300000(1216KB),没有写偏移地址,则会接着上一个分区线束地址。
storage:这个是存储分区划分了0x60000(384KB)
如果修改了bootloader,并且长度超过了划分的大小(0x7000),划分分区表的时候最好不要指定offset,不然内容重叠之后会出现不可预料的问题。
参考分区表cvs:
# Name, Type, SubType, Offset, Size, Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 0x130000,
ota_0, app, ota_0, , 0x130000,
ota_1, app, ota_1, , 0x130000,
storage, data, spiffs, , 0x60000,
我们可以看到启动信息里面的分区信息如下:
I (66) boot: Partition Table:
I (69) boot: ## Label Usage Type ST Offset Length
I (76) boot: 0 nvs WiFi data 01 02 00009000 00004000
I (84) boot: 1 otadata OTA data 01 00 0000d000 00002000
I (91) boot: 2 phy_init RF data 01 01 0000f000 00001000
I (99) boot: 3 factory factory app 00 00 00010000 00130000
I (106) boot: 4 ota_0 OTA app 00 10 00140000 00130000
I (114) boot: 5 ota_1 OTA app 00 11 00270000 00130000
I (121) boot: 6 storage Unknown data 01 82 003a0000 00060000
I (129) boot: End of partition table
I (133) boot: Defaulting to factory image