1、背景
由於做的下載文件速度過慢,而OTA Demo的下載速度很快,應該有必要了解兩者的差距。
1、OTA只有一個Get請求,而我的1K接1K的請求,速度就慢了
2、兩片Flash的問題。
1.1 資料
ESP32技術參考手冊
ESP32系列芯片技術規格書
2、ESP32 存儲系統
2.1 存儲系統簡介
地址0x4000_0000以下的部分屬於數據總線的地址範圍;
地址0x4000_0000~0x4FFF_FFFF部分屬於指令總線的地址範圍;
地址0x5000_0000及以上的部分是數據總線和指令總線共用的地址範圍。
存儲系統分爲片上存儲和片外存儲。
其中片上存儲包括:
• 448 KB 的 ROM,用於程序啓動和內核功能調用
• 520 KB 片上 SRAM,用於數據和指令存儲
• RTC 快速存儲器,爲 8 KB 的 SRAM,可以在 Deep-sleep 模式下 RTC 啓動時用於數據存儲以及被主 CPU
訪問
• RTC 慢速存儲器,爲 8 KB 的 SRAM,可以在 Deep-sleep 模式下被協處理器訪問
• 1 Kbit 的 eFuse,其中 256 bit 爲系統專用(MAC 地址和芯片設置) ; 其餘 768 bit 保留給用戶程序, 這些程
序包括 flash 加密和芯片 ID
• 嵌入式 flash ESP32-D2WD帶有16Mbit,40MHz的嵌入式flash,與GPIO16,GPIO17,SD_CMD,SD_CLK,SD_DATA_0和SD_DATA_1連接。
ESP32支持多個外部QSPI flash和靜態隨機存儲器SRAM。
外部 flash 可以同時映射到 CPU 指令和只讀數據空間。外部 flash 最大可支持 16 MB。
外部 SRAM 可映射到 CPU 數據空間。外部 SRAM 最大可支持 8 MB。一次最多可映射 4 MB。雖然ESP32能夠支持多種類型的RAM芯片,但ESP32_SDK目前支持ESP_PSRAM32、ESP_PSRAM64 這是1.8V器件。
在芯片啓動後,用戶程序可以MAP外部SRAM或flash到CPU地址空間。
下面QSPI接口下的對Flash和SRAM的並行支持。
外部SRAM包含在存儲器映射中,並且在某些限定內,可以用與內部數據RAM相同的方式來使用。樂鑫的WROVER系列模組就包括了ESP 1.8v Flash和集成在模塊內的ESP-PSRAM。
2.2 軟件支持的外部RAM(External RAM)
ESP-IDF完全支持在應用程序中使用外部RAM,在啓動時初始化外部RAM,提供了多種方式來配置處理外部RAM。
Initialize SPI RAM when booting the ESP32,即在ESP32boot時初始化SPI RAM。
方式1、整合RAM到ESP32內存映射。這是一個外部RAM的基本選項。外部RAM指向地址空間0x3F800000(字節訪問)。外部RAM的區域大小是SPI RAM大小(最大4MB)。通過指針指向外部RAM來放置數據。
方式2、初始化RAM並將其添加到功能分配器。這就允許程序使用heap_caps_malloc(size,MALLOC_CAP_SPIRAM)專門分配一塊外部RAM。可以使用該內存,然後使用正常的free()來釋放。映射到0x3F800000.
方式3、初始化 RAM,將其添加到功能分配器,並將內存添加到可由 malloc()
返回的 RAM 池中。 這允許任何應用程序使用外部 RAM 而無需重寫代碼以使用 heap_caps_malloc
。這是默認。
方式4、允許在外部RAM放置BSS段,這段地址空間起始於0x3F800000,用於lwip、net80211、libpp和bluedroid ESP-IDF庫存儲初始化爲零的數據(bss段)。通過在靜態聲明中應用EXT_RAM_ATTR 宏(未初始化爲0值)從內部BSS段移到外部RAM。這有效減少BSS段使用的內部靜態內存。
2.3 外部Flash
與SPI flash配合使用的底層ROM功能沒有與附加到SPI外圍設備(SPI0除外)的Flash芯片一起工作的規定。
ESP-IDF提供了使用Flash的功能函數,但是一般來說,儘量避免使用原始的SPI flash功能,推薦使用特定分區的功能。因此需要配置分區表。
2.3.1 分區表
2.3.1.1、概念和組成
ESP32的flash可以包含多個應用程序以及多種不同類型的數據(例如校正數據、文件系統數據、參數存儲器數據),因此,需要引入分區表的概念。
分區表幫助用戶在實際產品開發過程中對Flash分區定製才能更好地滿足產品需求。
分區表一般在flash中的默認偏移地址爲0x8000處燒寫,大小爲C00(最多可以保存95條分區表條目)。分區表數據後還保存着該表的MD5校驗和,校驗分區表的完整性。使能安全啓動,還存有簽名信息。
分區表組成
Name標籤 | 不超過16個字符 | |
Type類型 | 類型有兩種app(0)或者data(1),也可以使用其他數據(0x40~0xFE)作爲自定義分區類型 | 1 |
SubType子類型 | 8bit,具體和Type有關;Type==app時,SubType可以指定爲factory(0)、ota_0(0x10)....ota_15(0x1F)或者test(0x20)--預留app子類型,用於工廠測試過程 ESP-IDF目前不支持; Type==data,SubType字段可以指定爲0ta(0)-OTA數據分區、phy(1)—PHY初始化信息、nvs(2)-非易失性存儲或nvs_keys(4)-NVS祕鑰分區,至少4096字節。 |
|
Offset偏移量 | 指定偏移地址,一般緊跟前一個分區開始,app分區必須0x10000(64K)對齊,用","時gen_esp32part.py工具會自動計算一個滿足對齊要求的偏移地址,沒有對齊,工具會報錯 | |
Size | 支持K和M的倍數單位,默認字節 | |
flag | 應支持encrypted標誌,在啓動Flash加密後,該分區會被加密。app分區始終被加密。 |
分區表例子
NVS和PHY分區是必不可少的。
2.3.1.2、分區表類型----使用make partition_table命令來打印分區表摘要
內置分區表:
Single factory app,no OTA
# Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,24K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,2M,
Factory app, two OTA definitions
比自定義分區表CSV圖的結構多factory分區。factory分區可有也可無。
自定義分區表
就該CSV文件可以根據需求,描述任意數量的分區信息。分區表的offset可以爲空,gen_esp32part.py工具會從分區表位置的後面自動計算並填充該分區的偏移地址,並確保每個分區的偏移地址正確對齊。
2.3.1.3、生成二進制分區表和MD5校驗和
CSV->bin工具: partition_table/gen_esp32part.py工具
方法:在make menuconfig指定分區表CSV文件的名稱,執行make partition_table.
3、思考HTTP流下載文件