[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