今天我們來說說ESP32 for Arduino存儲分布以及啟動過程。
ESP32 for Arduino存儲分布
ESP32有多個不同的存儲配置版本,本文以ESP32 4M FLASH為例進行分析。
ESP32的FLASH可以包含多個應用程序以及不同類型的數據,因此在FLASH默認偏移地址的0x8000處燒寫了一個分區表,長度為0xC00字節,分區表數據后還保存著該表的 MD5 校驗和,用于驗證分區表的完整性。此外,如果芯片使能了 安全啟動 功能,則該分區表后還會保存簽名信息。
我們在ESP32 for Arduino的工具中,有一個選項,可以配置不同的分區表,這里已經做好了一些,一般我們都是使用默認的,如下圖所示:
分別代表什么意思呢?4M FLASH默認分區方案為1.2MB的應用程序空間,1.2MB為OTA保留,1.5MB為SPIFFS文件系統保留的,我們找到這個描述文件,在SDK下tools下的partitions,我們打開default.csv,對應默認的分區表:
表格描述的很清楚,各個分區名字,對應的偏移地址,以及占用大小,比如,nvs分區,從0x9000地址處開始,大小為0x5000,也就是20480字節的大小,具體每個分區的作用,我們下面細說。我們這里知道的就是,在0x9000處放了一個nvs表,決定我們整個存儲區域怎么劃分的,每個分區分別分配多大的存儲空間,系統就根據這個表來劃分,可以根據我們的程序大小等靈活配置。
分區表說明
網上找到一張ESP32的分區表,很有代表意義,這里以這一份給大家講一下。
- 0-0x1000 保留
- 0x1000-0x8000 Bootloader分區
- 0x8000-0x9000 Partition Table分區,保存著分區表
- 0x9000-0xD000 NVS分區,可以存儲一些PHY初始化數據,也可以存儲其他數據,一些斷電存儲的數據建議放在這里
- 0xD000-0xF000 OTA data分區,系統從哪個app分區啟動由這里存儲的數據決定
- 0xF000-0x10000 PHy_init分區,用于存儲的PHY初始化數據
- 0x10000-0x3FFFFF Factory APP分區,保存出廠應用程序,分區表有工廠應用程序就會啟動這個分區的程序
- Core dump分區,查找系統崩潰時的軟件錯誤,以便開發者分析原因
- OTA0/OTA1分區,保存OTA下載固件,交替保存在這兩個分區,鏡像驗證無誤之后,會更新OTA data分區,分配好下一次應該從哪里啟動。
- fctry分區,保存阿里云四元組,這個就是私有數據了,可以在存儲空間的最后分配一些空間用于保存一些APP的激活數據之類的,沒有用到就可以忽略。
到這里,大家應該都了解了吧,正常情況下我們用系統內置的一些默認的就可以,當然,我們也可以自定義分區表,總之就是根據自己的具體情況具體分配,這里不具體展開說,后面有需要再展開說。
程序燒錄
代碼燒錄就是把上面的每個分區的文件分別燒錄進FLASH芯片中,我們以一個默認的例子,看下Arduino是怎么燒錄的:
如上圖所示,根據每個分區的地址,將用到的各個分區的內容依次燒錄進FLASH中,關于存儲空間的分配我們就講到這里。
程序啟動過程
ESP32,是如何運行RTOS的?
1、 第一階段bootloader(ROM中)加載第二階段bootloader(位于FLASH 0X1000)
2、 第二階段的boot loader加載分區表和MAIN APP應用程序(其實就是freertos了)
main APP包含RAM段和Flash段
① 去0X8000加載分區表,配置兩個CPU(PRO CPU和APP CPU)的MMU,但只使能PRO cpu的flash,一旦被加載,就會跳到main APP的入口
3、執行main APP,此時,第二個CPU和RTOS調度器都會運行
入口調用 componments/esp32/cpu_start.c中的call_start_cpu0函數,
此函數會調用 call_start_cpu1.執行后PRO CPU執行start_cpu0,APP CPU執行start_cpu1
最終會調用app_main函數
我們打開ESP32 SDK中的core文件夾,里面有個main.cpp文件,打開我們就知道,app_main調用了loopTask函數,loopTask會先調用setup函數,再調用loop函數,loop函數會一直死循環,所以我們可以在setup里創建任務。
我們Arduino中的setup與loop函數就是上面的函數中調用的,這里我們也可以看出,ESP32在Arduino下不是裸奔的,是跑的FreeRTOS操作系統的!
感謝大家,關于ESP32的學習,希望大家Enjoy!
-
FlaSh
+關注
關注
10文章
1633瀏覽量
147944 -
存儲
+關注
關注
13文章
4296瀏覽量
85801 -
Arduino
+關注
關注
188文章
6468瀏覽量
186956 -
程序燒錄
+關注
關注
0文章
9瀏覽量
6848 -
ESP32
+關注
關注
18文章
971瀏覽量
17203
發布評論請先 登錄
相關推薦
評論