0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32學(xué)習(xí)筆記:存儲(chǔ)分布和啟動(dòng)過(guò)程

CHANBAEK ? 來(lái)源:跳動(dòng)的字節(jié) ? 作者:曉宇 ? 2023-07-14 15:10 ? 次閱讀

今天我們來(lái)說(shuō)說(shuō)ESP32 for Arduino存儲(chǔ)分布以及啟動(dòng)過(guò)程。

ESP32 for Arduino存儲(chǔ)分布

ESP32有多個(gè)不同的存儲(chǔ)配置版本,本文以ESP32 4M FLASH為例進(jìn)行分析。

ESP32的FLASH可以包含多個(gè)應(yīng)用程序以及不同類型的數(shù)據(jù),因此在FLASH默認(rèn)偏移地址的0x8000處燒寫了一個(gè)分區(qū)表,長(zhǎng)度為0xC00字節(jié),分區(qū)表數(shù)據(jù)后還保存著該表的 MD5 校驗(yàn)和,用于驗(yàn)證分區(qū)表的完整性。此外,如果芯片使能了 安全啟動(dòng) 功能,則該分區(qū)表后還會(huì)保存簽名信息。

我們?cè)贓SP32 for Arduino的工具中,有一個(gè)選項(xiàng),可以配置不同的分區(qū)表,這里已經(jīng)做好了一些,一般我們都是使用默認(rèn)的,如下圖所示:

圖片

分別代表什么意思呢?4M FLASH默認(rèn)分區(qū)方案為1.2MB的應(yīng)用程序空間,1.2MB為OTA保留,1.5MB為SPIFFS文件系統(tǒng)保留的,我們找到這個(gè)描述文件,在SDK下tools下的partitions,我們打開(kāi)default.csv,對(duì)應(yīng)默認(rèn)的分區(qū)表:

圖片

表格描述的很清楚,各個(gè)分區(qū)名字,對(duì)應(yīng)的偏移地址,以及占用大小,比如,nvs分區(qū),從0x9000地址處開(kāi)始,大小為0x5000,也就是20480字節(jié)的大小,具體每個(gè)分區(qū)的作用,我們下面細(xì)說(shuō)。我們這里知道的就是,在0x9000處放了一個(gè)nvs表,決定我們整個(gè)存儲(chǔ)區(qū)域怎么劃分的,每個(gè)分區(qū)分別分配多大的存儲(chǔ)空間,系統(tǒng)就根據(jù)這個(gè)表來(lái)劃分,可以根據(jù)我們的程序大小等靈活配置。

分區(qū)表說(shuō)明

網(wǎng)上找到一張ESP32的分區(qū)表,很有代表意義,這里以這一份給大家講一下。

圖片

  • 0-0x1000 保留
  • 0x1000-0x8000 Bootloader分區(qū)
  • 0x8000-0x9000 Partition Table分區(qū),保存著分區(qū)表
  • 0x9000-0xD000 NVS分區(qū),可以存儲(chǔ)一些PHY初始化數(shù)據(jù),也可以存儲(chǔ)其他數(shù)據(jù),一些斷電存儲(chǔ)的數(shù)據(jù)建議放在這里
  • 0xD000-0xF000 OTA data分區(qū),系統(tǒng)從哪個(gè)app分區(qū)啟動(dòng)由這里存儲(chǔ)的數(shù)據(jù)決定
  • 0xF000-0x10000 PHy_init分區(qū),用于存儲(chǔ)的PHY初始化數(shù)據(jù)
  • 0x10000-0x3FFFFF Factory APP分區(qū),保存出廠應(yīng)用程序,分區(qū)表有工廠應(yīng)用程序就會(huì)啟動(dòng)這個(gè)分區(qū)的程序
  • Core dump分區(qū),查找系統(tǒng)崩潰時(shí)的軟件錯(cuò)誤,以便開(kāi)發(fā)者分析原因
  • OTA0/OTA1分區(qū),保存OTA下載固件,交替保存在這兩個(gè)分區(qū),鏡像驗(yàn)證無(wú)誤之后,會(huì)更新OTA data分區(qū),分配好下一次應(yīng)該從哪里啟動(dòng)。
  • fctry分區(qū),保存阿里云四元組,這個(gè)就是私有數(shù)據(jù)了,可以在存儲(chǔ)空間的最后分配一些空間用于保存一些APP的激活數(shù)據(jù)之類的,沒(méi)有用到就可以忽略。

到這里,大家應(yīng)該都了解了吧,正常情況下我們用系統(tǒng)內(nèi)置的一些默認(rèn)的就可以,當(dāng)然,我們也可以自定義分區(qū)表,總之就是根據(jù)自己的具體情況具體分配,這里不具體展開(kāi)說(shuō),后面有需要再展開(kāi)說(shuō)。

程序燒錄

代碼燒錄就是把上面的每個(gè)分區(qū)的文件分別燒錄進(jìn)FLASH芯片中,我們以一個(gè)默認(rèn)的例子,看下Arduino是怎么燒錄的:

圖片

如上圖所示,根據(jù)每個(gè)分區(qū)的地址,將用到的各個(gè)分區(qū)的內(nèi)容依次燒錄進(jìn)FLASH中,關(guān)于存儲(chǔ)空間的分配我們就講到這里。

程序啟動(dòng)過(guò)程

ESP32,是如何運(yùn)行RTOS的?

參考文檔 general-notes.rst

1、 第一階段bootloader(ROM中)加載第二階段bootloader(位于FLASH 0X1000)

2、 第二階段的boot loader加載分區(qū)表和MAIN APP應(yīng)用程序(其實(shí)就是freertos了)

main APP包含RAM段和Flash段

① 去0X8000加載分區(qū)表,配置兩個(gè)CPU(PRO CPU和APP CPU)的MMU,但只使能PRO cpu的flash,一旦被加載,就會(huì)跳到main APP的入口

3、執(zhí)行main APP,此時(shí),第二個(gè)CPU和RTOS調(diào)度器都會(huì)運(yùn)行

入口調(diào)用 componments/esp32/cpu_start.c中的call_start_cpu0函數(shù),

此函數(shù)會(huì)調(diào)用 call_start_cpu1.執(zhí)行后PRO CPU執(zhí)行start_cpu0,APP CPU執(zhí)行start_cpu1

最終會(huì)調(diào)用app_main函數(shù)

我們打開(kāi)ESP32 SDK中的core文件夾,里面有個(gè)main.cpp文件,打開(kāi)我們就知道,app_main調(diào)用了loopTask函數(shù),loopTask會(huì)先調(diào)用setup函數(shù),再調(diào)用loop函數(shù),loop函數(shù)會(huì)一直死循環(huán),所以我們可以在setup里創(chuàng)建任務(wù)。

圖片

我們Arduino中的setup與loop函數(shù)就是上面的函數(shù)中調(diào)用的,這里我們也可以看出,ESP32在Arduino下不是裸奔的,是跑的FreeRTOS操作系統(tǒng)的!

感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1635

    瀏覽量

    148016
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4314

    瀏覽量

    85842
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6469

    瀏覽量

    187054
  • 程序燒錄
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6850
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    971

    瀏覽量

    17256
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳解STM32啟動(dòng)過(guò)程

    本章教程主要跟大家講STM32H7的啟動(dòng)過(guò)程,這里的啟動(dòng)過(guò)程是指從CPU上電復(fù)位執(zhí)行第1條指令開(kāi)始(匯編文件)到進(jìn)入C程序main()函數(shù)入口之間的部分。
    發(fā)表于 11-14 11:24 ?1853次閱讀

    ESP32單片機(jī)學(xué)習(xí)筆記

    ESP32 單片機(jī)學(xué)習(xí)筆記 - 03 - MCPWM脈沖輸出/PCNT脈沖計(jì)數(shù)前言,繼續(xù)上一篇的內(nèi)容。因?yàn)樯弦黄獎(jiǎng)偤脤?shí)驗(yàn)了iic和spi,形成一對(duì)。接下來(lái)講pwm另起一篇。一、電機(jī)PWM輸出
    發(fā)表于 08-23 08:47

    ESP32ESP-IDF學(xué)習(xí)筆記

    ESP32ESP-IDF 學(xué)習(xí)筆記(六)【I2C數(shù)據(jù)總線(I2C)】文章目錄ESP32ESP
    發(fā)表于 02-22 07:30

    系統(tǒng)啟動(dòng)過(guò)程

    系統(tǒng)啟動(dòng)過(guò)程系統(tǒng)啟動(dòng)過(guò)程主要由一下幾步組成(以硬盤啟動(dòng)為例):1. 開(kāi)機(jī)2. BIOS 加電自檢 ( Power On Self Test -- POST ),內(nèi)存地址為 0ffff:00003. 將硬盤第一個(gè)
    發(fā)表于 10-11 12:17 ?2259次閱讀

    IC啟動(dòng)過(guò)程及Vcc電壓波形的認(rèn)知

    IC啟動(dòng)過(guò)程及Vcc電壓波形的認(rèn)知IC啟動(dòng)過(guò)程及Vcc電壓波形的認(rèn)知IC啟動(dòng)過(guò)程及Vcc電壓波形的認(rèn)知IC啟動(dòng)過(guò)程及Vcc電壓波形的認(rèn)知
    發(fā)表于 12-22 14:46 ?10次下載

    淺析Zephyr在ESP32上的啟動(dòng)流程

    理解Zephyr在一款soc上的啟動(dòng)流程,有利于分析和調(diào)試開(kāi)機(jī)過(guò)程卡死,驅(qū)動(dòng)異常等的問(wèn)題。因此在上手一款新的soc時(shí)掌握Z(yǔ)ephyr在其上面的啟動(dòng)流程非常必要。本文對(duì)Zephyr在ESP32
    的頭像 發(fā)表于 06-07 17:04 ?5288次閱讀

    ESP32 開(kāi)發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X

    ESP32 開(kāi)發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X
    發(fā)表于 11-14 09:06 ?6次下載
    <b class='flag-5'>ESP32</b> 開(kāi)發(fā)<b class='flag-5'>筆記</b>(四)LVGL控件<b class='flag-5'>學(xué)習(xí)</b> Window 窗口控件 X

    [ESP32]學(xué)習(xí)筆記02

    [ESP32學(xué)習(xí)筆記02]使用ViusalStudio2017開(kāi)發(fā)ESP32、按鍵輸入檢測(cè)前言一、安裝Visual Studio 2017二、配置開(kāi)發(fā)環(huán)境1.安裝ViusalGDB2.
    發(fā)表于 12-03 17:36 ?23次下載
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>02

    stm32啟動(dòng)過(guò)程

    一次性搞定stm32啟動(dòng)模式與啟動(dòng)過(guò)程一、stm32啟動(dòng)模式二、從flash啟動(dòng)過(guò)程2.1 數(shù)據(jù)在堆棧中存儲(chǔ)方式2.2 stm32的正常
    發(fā)表于 12-16 16:57 ?8次下載
    stm32<b class='flag-5'>啟動(dòng)過(guò)程</b>

    [ESP32]學(xué)習(xí)筆記04

    Analog-to-Digital Converter(模數(shù)轉(zhuǎn)換器)的使用今天我們學(xué)習(xí)ESP32提供的ADC外設(shè)的使用,ESP32的每個(gè)ADC單元都支持兩種模式,單次讀取和連續(xù)讀取(DMA),本次
    發(fā)表于 12-22 19:02 ?9次下載
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>04

    SPI主線協(xié)議——ESP32學(xué)習(xí)筆記

    目錄SPI主線協(xié)議——ESP32學(xué)習(xí)筆記零、前言一、什么是SPI?二、通信過(guò)程?三、極性和相位四、總結(jié)SPI主線協(xié)議——ESP32
    發(fā)表于 12-22 19:23 ?18次下載
    SPI主線協(xié)議——<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    STM32啟動(dòng)過(guò)程分析

    之后,非常有助于我們理解 STM32 啟動(dòng)過(guò)程中還做了哪些隱藏的工作。關(guān)于詳細(xì)的程序和數(shù)據(jù)存儲(chǔ)分布信息,我們可以從Keil生成的 .map 文件中得到,要生成 .map 文件操作如下:1.1 STM32的程序在flash上的
    發(fā)表于 12-23 19:55 ?12次下載
    STM32<b class='flag-5'>啟動(dòng)過(guò)程</b>分析

    ESP32學(xué)習(xí)筆記:雙核

    今天我們來(lái)說(shuō)說(shuō)ESP32 for Arduino 的雙核。
    的頭像 發(fā)表于 07-15 16:16 ?5011次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>:雙核

    ESP32學(xué)習(xí)筆記:WiFi

    今天我們來(lái)說(shuō)說(shuō)ESP32 的WiFi。
    的頭像 發(fā)表于 07-15 16:20 ?3984次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>:WiFi

    RL78啟動(dòng)過(guò)程詳解

    RL78啟動(dòng)過(guò)程詳解
    的頭像 發(fā)表于 09-28 16:39 ?1460次閱讀
    RL78<b class='flag-5'>啟動(dòng)過(guò)程</b>詳解