ESP32的啟動過程詳解
ESP32 是一種基于 ARM Cortex-M 處理器的 32 位微控制器,集成了 2.4GHz Wi-Fi 和藍(lán)牙雙模功能。 ESP32 的啟動過程可以分為以下三個階段:
本文引用地址:http://m.butianyuan.cn/article/202312/453851.htm一級引導(dǎo)程序:當(dāng) ESP32 上電或復(fù)位后,PRO CPU 會立即開始運(yùn)行,執(zhí)行復(fù)位向量代碼,而 APP CPU 仍然保持復(fù)位狀態(tài)。 復(fù)位向量代碼會檢查 GPIO_STRAP_REG 寄存器的值,確定 ESP32 的啟動模式,如 UART 下載模式、自定義啟動模式等。如果是正常啟動模式,程序會配置 SPI flash,然后嘗試從 flash 的 0x1000 偏移地址處加載二級引導(dǎo)程序的二進(jìn)制鏡像。 程序會校驗鏡像的校驗和,如果正確,就會跳轉(zhuǎn)到鏡像的入口點(diǎn)運(yùn)行。
二級引導(dǎo)程序:二級引導(dǎo)程序的源碼可以在 ESP-IDF 的 components/bootloader 目錄下找到。 二級引導(dǎo)程序會從 flash 的 0x8000 偏移地址處讀取分區(qū)表,分區(qū)表包含了 flash 上不同分區(qū)的類型、偏移地址、大小等信息。 二級引導(dǎo)程序會尋找工廠分區(qū)和 OTA 應(yīng)用程序分區(qū),如果存在 OTA 應(yīng)用程序分區(qū),還會查詢 otadata 分區(qū),以確定應(yīng)該引導(dǎo)哪個分區(qū)。 對于選定的分區(qū),二級引導(dǎo)程序會從 flash 中逐段讀取應(yīng)用程序鏡像,對于需要加載到 RAM 中的段,會將數(shù)據(jù)從 flash 復(fù)制到它們的加載地址處,對于需要從 flash 中運(yùn)行的段,會通過配置 flash MMU,提供正確的映射。 一旦處理完所有段,二級引導(dǎo)程序會驗證應(yīng)用程序的完整性,如果使用了安全啟動或 flash 加密功能,還會進(jìn)行相應(yīng)的驗證和解密。最后,二級引導(dǎo)程序會跳轉(zhuǎn)到應(yīng)用程序鏡像的入口點(diǎn)運(yùn)行。
應(yīng)用程序啟動:應(yīng)用程序啟動包含了從應(yīng)用程序開始執(zhí)行到 app_main 函數(shù)在主任務(wù)內(nèi)部運(yùn)行前的所有過程。 應(yīng)用程序啟動可以分為三個子階段:端口初始化:這個階段會初始化基本的 C 運(yùn)行環(huán)境,配置 CPU 異常,初始化內(nèi)部存儲器,設(shè)置 CPU 時鐘,如果配置了 PSRAM,還會使能 PSRAM。如果應(yīng)用程序被配置為在多個內(nèi)核上運(yùn)行,還會啟動另一個內(nèi)核并等待其初始化。系統(tǒng)初始化:這個階段會初始化軟件服務(wù)和 FreeRTOS,包括堆棧、中斷、任務(wù)、定時器、事件組、隊列、信號量等。 還會初始化一些系統(tǒng)組件,如 NVS、SPI flash、日志、應(yīng)用程序跟蹤等。主任務(wù)運(yùn)行:這個階段會創(chuàng)建一個主任務(wù),并在其中調(diào)用 app_main 函數(shù),這是應(yīng)用程序的入口函數(shù),用戶可以在這里編寫自己的代碼,實(shí)現(xiàn)各種功能和服務(wù)。
評論