ESP32 存儲系統及Flash,進而考慮HTTP升級文件

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分區始終被加密。  

分區表例子

自定義分區表CSV

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流下載文件

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章