老宇哥带你玩转 ESP32:10 ESP32存储分布以及启动过程
今天我们来说说ESP32 for Arduino存储分布以及启动过程
。
ESP32 for Arduino存储分布
ESP32有多个不同的存储配置版本,本文以ESP32 4M FLASH
为例进行分析。
ESP32的FLASH可以包含多个应用程序以及不同类型的数据,因此在FLASH默认偏移地址的0x8000处烧写了一个分区表
,长度为0xC00字节,分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了 安全启动 功能,则该分区表后还会保存签名信息。
我们在ESP32 for Arduino的工具中,有一个选项,可以配置不同的分区表
,这里已经做好了一些,一般我们都是使用默认的,如下图所示:
1.2MB的应用程序空间,1.2MB为OTA保留,1.5MB为SPIFFS文件系统
保留的,我们找到这个描述文件,在SDK下tools下的partitions,我们打开default.csv,对应默认的分区表:偏移地址
,以及占用大小
,比如,nvs分区,从0x9000地址处开始,大小为0x5000,也就是20480字节的大小,具体每个分区的作用,我们下面细说。我们这里知道的就是,在0x9000处放了一个nvs表,决定我们整个存储区域怎么划分
的,每个分区分别分配多大的存储空间,系统就根据这个表来划分,可以根据我们的程序大小等灵活配置
。分区表说明
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的激活数据之类的,没有用到就可以忽略。
到这里,大家应该都了解了吧,正常情况下我们用系统内置的一些默认的就可以,当然,我们也可以自定义分区表
,总之就是根据自己的具体情况具体分配,这里不具体展开说,后面有需要再展开说。
程序烧录
Arduino是怎么烧录
的:程序启动过程
ESP32,是如何运行RTOS的?
参考文档 general-notes.rst
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函数
setup与loop函数
就是上面的函数中调用的,这里我们也可以看出,ESP32在Arduino下不是裸奔
的,是跑的FreeRTOS
操作系统的!感谢大家,关于ESP32的学习,希望大家Enjoy!
老宇哥带你玩转 ESP32:05 ADC用起来这也太简单了吧
老宇哥带你玩转 ESP32:04 串口玩起来是真方便
老宇哥带你玩转ESP32:03 GPIO数字输入与数字输出
老宇哥带你玩转ESP32:02使用VSCode+PlatformIO搭建开发环境