ESP32的開機載入過程
緣起 我要把 ESP32通用資料紀錄器 加上韌體更新功能,不用都接上VSCODE重燒;理論上這些功能SDK都做好了,但是沒搞清楚來龍去脈總是不踏實,來解謎吧 我得搞清楚韌體的內容怎麼封裝到binary,儲存空間規劃,怎麼載入系統,這樣才紮實 code data-rw data-ro ESP32-C3的記憶體 先在 技術手冊 找到memory map,表格右邊是internal ROM/ SRAM,384K的internal ROM不小:放開機程式,基礎算法,底層協議核心;internal RAM,可以放高速執行的code,也可以放data,data & insntruction bus都有連過去 Internal RAM = 400KB = 16KB + 384KB。前面的16KB是boot ROM執行需要的資料,專門挖一塊;後面的384KB是使用者摸得到的資料區 上圖表格往左,兩塊8MB data & instruction存取External Memory,如下圖,CPU發出的addr先到達$,再經過MMU,最後走SPI0存取Flash,細節如下: Unified I&D$,8-way,16KB,32byte $-line MMU page size = 64KB,負責把CPU發出的vaddr轉成flash的paddr。透過MMU可以把軟體放在Flash的任意位置,但是CPU看出去都是固定的位址。其中一個應用是韌體更新,可以在Flash放上新舊韌體,任意一個都能執行 ESP32-C3有兩套SPI,SPI0是CPU專用,存取Flash開頭0~8MB的位置;也能存取同一顆Flash,但是能存取0~16M。比如我們放上大顆的Flash(16MB),透過SPI1存取8-16M,後面可能放影像,網頁這類的resources Linker Script 在build/esp-idf/esp_system/ld/memory.ld定義了內部的RAM & Flash,他們對應到上一節memory map的記憶體區塊 Instruction iram0_0_seg (RX), Internal RAM iram0_2_seg (RX), Flash Data dram0_0_seg (RW), Internal RAM drom0_0_seg (R...