序言
esp32如果使同時使用了藍牙模塊、wifi模塊和ota的話很有可能會導致程序過大(超過1M),系統無法啟動的情況。這里提供一種通過修改分區表擴大程序儲存空間的方法來避免這一問題。這一解決方法同樣只用於因為其他問題導致的程序過大的情況。
現象
上電后esp32會屏幕重啟,如果此時接通串口0觀察到打印出來的內容。如果開啟了日志則會如圖1,否則會如圖2
圖1
圖2
分區表
簡單的來說,分區表就是對Flash進行划分,不同區域存放不同的東西。如下面一個分區表文件對應的是圖3的划分。通過對比文件和圖3,很容易理解分區表。每一行對應的內容順序分別是Name, Type, SubType, Offset,Size。如果Offset沒有填寫則默認在上一個分區的末尾添加。在esp-idf/components/partition_table有多個分區表文件供參考。
# Name, Type, SubType, Offset, Size
# 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,
factory, app, factory, , 1M,
coredump, data, coredump, , 64K,
ota_0, app, ota_0, , 1M,
ota_1, app, ota_1, , 1M,
圖3
來自官方的分區表說明:
每片 ESP32 的 flash 可以包含多個應用程序,以及多種不同類型的數據(例如校准數據、文件系統數據、參數存儲器數據等)。因此,引入分區表的概念。
具體來說,ESP32 在 flash 的 默認偏移地址 0x8000 處燒寫一張分區表。該分區表的長度為 0xC00 字節(最多可以保存 95 條分區表條目)。分區表數據后還保存着該表的 MD5 校驗和,用於驗證分區表的完整性。此外,如果芯片使能了 安全啟動 功能,則該分區表后還會保存簽名信息。
分區表中的每個條目都包括以下幾個部分:Name(標簽)、Type(app、data 等)、SubType 以及在 flash 中的偏移量(分區的加載地址)。
具體內容參見:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/partition-tables.html
解決
造成這一現象的原因是程序超出了flash中預先分配的程序存儲空間(1M),通過修改分區表可以解決。步驟如下:
1.建立自己的分區表.CSV文件
2.make menuconfig 菜單中 Partition Table-->Partition Table選擇Custom partition table CSV,Custom partition CSV file中指定CSV文件地址。
這里提供一個我的分區表,程序存儲空間應該是0x10000的整數倍:
# 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,
factory, app, factory, , 0x140000,
ota_0, app, ota_0, , 0x140000,
ota_1, app, ota_1, , 0x140000,
需要注意的是:
1、分配分區表的時候空間一定要是4k的整數倍也就是:存儲空間%4096=0。這是因為flash的一個區塊是4k。
2、ota分區(ota_0,ota_1)的空間最好和原廠程序(factory)相同