今天我們來說說ESP32 for Arduino存儲分布以及啟動過程。
ESP32 for Arduino存儲分布
ESP32有多個不同的存儲配置版本,本文以ESP32 4M FLASH為例進(jìn)行分析。
ESP32的FLASH可以包含多個應(yīng)用程序以及不同類型的數(shù)據(jù),因此在FLASH默認(rèn)偏移地址的0x8000處燒寫了一個分區(qū)表,長度為0xC00字節(jié),分區(qū)表數(shù)據(jù)后還保存著該表的 MD5 校驗和,用于驗證分區(qū)表的完整性。此外,如果芯片使能了 安全啟動 功能,則該分區(qū)表后還會保存簽名信息。
我們在ESP32 for Arduino的工具中,有一個選項,可以配置不同的分區(qū)表,這里已經(jīng)做好了一些,一般我們都是使用默認(rèn)的,如下圖所示:
分別代表什么意思呢?4M FLASH默認(rèn)分區(qū)方案為1.2MB的應(yīng)用程序空間,1.2MB為OTA保留,1.5MB為SPIFFS文件系統(tǒng)保留的,我們找到這個描述文件,在SDK下tools下的partitions,我們打開default.csv,對應(yīng)默認(rèn)的分區(qū)表:
表格描述的很清楚,各個分區(qū)名字,對應(yīng)的偏移地址,以及占用大小,比如,nvs分區(qū),從0x9000地址處開始,大小為0x5000,也就是20480字節(jié)的大小,具體每個分區(qū)的作用,我們下面細(xì)說。我們這里知道的就是,在0x9000處放了一個nvs表,決定我們整個存儲區(qū)域怎么劃分的,每個分區(qū)分別分配多大的存儲空間,系統(tǒng)就根據(jù)這個表來劃分,可以根據(jù)我們的程序大小等靈活配置。
分區(qū)表說明
網(wǎng)上找到一張ESP32的分區(qū)表,很有代表意義,這里以這一份給大家講一下。
- 0-0x1000 保留
- 0x1000-0x8000 Bootloader分區(qū)
- 0x8000-0x9000 Partition Table分區(qū),保存著分區(qū)表
- 0x9000-0xD000 NVS分區(qū),可以存儲一些PHY初始化數(shù)據(jù),也可以存儲其他數(shù)據(jù),一些斷電存儲的數(shù)據(jù)建議放在這里
- 0xD000-0xF000 OTA data分區(qū),系統(tǒng)從哪個app分區(qū)啟動由這里存儲的數(shù)據(jù)決定
- 0xF000-0x10000 PHy_init分區(qū),用于存儲的PHY初始化數(shù)據(jù)
- 0x10000-0x3FFFFF Factory APP分區(qū),保存出廠應(yīng)用程序,分區(qū)表有工廠應(yīng)用程序就會啟動這個分區(qū)的程序
- Core dump分區(qū),查找系統(tǒng)崩潰時的軟件錯誤,以便開發(fā)者分析原因
- OTA0/OTA1分區(qū),保存OTA下載固件,交替保存在這兩個分區(qū),鏡像驗證無誤之后,會更新OTA data分區(qū),分配好下一次應(yīng)該從哪里啟動。
- fctry分區(qū),保存阿里云四元組,這個就是私有數(shù)據(jù)了,可以在存儲空間的最后分配一些空間用于保存一些APP的激活數(shù)據(jù)之類的,沒有用到就可以忽略。
到這里,大家應(yīng)該都了解了吧,正常情況下我們用系統(tǒng)內(nèi)置的一些默認(rèn)的就可以,當(dāng)然,我們也可以自定義分區(qū)表,總之就是根據(jù)自己的具體情況具體分配,這里不具體展開說,后面有需要再展開說。
程序燒錄
代碼燒錄就是把上面的每個分區(qū)的文件分別燒錄進(jìn)FLASH芯片中,我們以一個默認(rèn)的例子,看下Arduino是怎么燒錄的:
如上圖所示,根據(jù)每個分區(qū)的地址,將用到的各個分區(qū)的內(nèi)容依次燒錄進(jìn)FLASH中,關(guān)于存儲空間的分配我們就講到這里。
程序啟動過程
ESP32,是如何運行RTOS的?
1、 第一階段bootloader(ROM中)加載第二階段bootloader(位于FLASH 0X1000)
2、 第二階段的boot loader加載分區(qū)表和MAIN APP應(yīng)用程序(其實就是freertos了)
main APP包含RAM段和Flash段
① 去0X8000加載分區(qū)表,配置兩個CPU(PRO CPU和APP CPU)的MMU,但只使能PRO cpu的flash,一旦被加載,就會跳到main APP的入口
3、執(zhí)行main APP,此時,第二個CPU和RTOS調(diào)度器都會運行
入口調(diào)用 componments/esp32/cpu_start.c中的call_start_cpu0函數(shù),
此函數(shù)會調(diào)用 call_start_cpu1.執(zhí)行后PRO CPU執(zhí)行start_cpu0,APP CPU執(zhí)行start_cpu1
最終會調(diào)用app_main函數(shù)
我們打開ESP32 SDK中的core文件夾,里面有個main.cpp文件,打開我們就知道,app_main調(diào)用了loopTask函數(shù),loopTask會先調(diào)用setup函數(shù),再調(diào)用loop函數(shù),loop函數(shù)會一直死循環(huán),所以我們可以在setup里創(chuàng)建任務(wù)。
我們Arduino中的setup與loop函數(shù)就是上面的函數(shù)中調(diào)用的,這里我們也可以看出,ESP32在Arduino下不是裸奔的,是跑的FreeRTOS操作系統(tǒng)的!
感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!
-
FlaSh
+關(guān)注
關(guān)注
10文章
1644瀏覽量
148737 -
存儲
+關(guān)注
關(guān)注
13文章
4359瀏覽量
86202 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187914 -
程序燒錄
+關(guān)注
關(guān)注
0文章
9瀏覽量
6871 -
ESP32
+關(guān)注
關(guān)注
18文章
980瀏覽量
17554
發(fā)布評論請先 登錄
相關(guān)推薦
詳解STM32啟動過程
ESP32單片機(jī)學(xué)習(xí)筆記
ESP32之ESP-IDF學(xué)習(xí)筆記
系統(tǒng)啟動過程
IC啟動過程及Vcc電壓波形的認(rèn)知
淺析Zephyr在ESP32上的啟動流程
ESP32 開發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X
![<b class='flag-5'>ESP32</b> 開發(fā)<b class='flag-5'>筆記</b>(四)LVGL控件<b class='flag-5'>學(xué)習(xí)</b> Window 窗口控件 X](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記02
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>02](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32啟動過程
![stm32<b class='flag-5'>啟動過程</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記04
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>04](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SPI主線協(xié)議——ESP32學(xué)習(xí)筆記
![SPI主線協(xié)議——<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32啟動過程分析
![STM32<b class='flag-5'>啟動過程</b>分析](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論