今天我们来说说ESP32 for Arduino存储分布以及启动过程

ESP32 for Arduino存储分布

ESP32有多个不同的存储配置版本,本文以ESP32 4M FLASH为例进行分析。

ESP32的FLASH可以包含多个应用程序以及不同类型的数据,因此在FLASH默认偏移地址的0x8000处烧写了一个分区表,长度为0xC00字节,分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了 安全启动 功能,则该分区表后还会保存签名信息。

我们在ESP32 for Arduino的工具中,有一个选项,可以配置不同的分区表,这里已经做好了一些,一般我们都是使用默认的,如下图所示:

分别代表什么意思呢?4M FLASH默认分区方案为1.2MB的应用程序空间,1.2MB为OTA保留,1.5MB为SPIFFS文件系统保留的,我们找到这个描述文件,在SDK下tools下的partitions,我们打开default.csv,对应默认的分区表:

表格描述的很清楚,各个分区名字,对应的偏移地址,以及占用大小,比如,nvs分区,从0x9000地址处开始,大小为0x5000,也就是20480字节的大小,具体每个分区的作用,我们下面细说。我们这里知道的就是,在0x9000处放了一个nvs表,决定我们整个存储区域怎么划分的,每个分区分别分配多大的存储空间,系统就根据这个表来划分,可以根据我们的程序大小等灵活配置

分区表说明

网上找到一张ESP32的分区表,很有代表意义,这里以这一份给大家讲一下。

  • 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的激活数据之类的,没有用到就可以忽略。

到这里,大家应该都了解了吧,正常情况下我们用系统内置的一些默认的就可以,当然,我们也可以自定义分区表,总之就是根据自己的具体情况具体分配,这里不具体展开说,后面有需要再展开说。

程序烧录

代码烧录就是把上面的每个分区的文件分别烧录进FLASH芯片中,我们以一个默认的例子,看下Arduino是怎么烧录的:

如上图所示,根据每个分区的地址,将用到的各个分区的内容依次烧录进FLASH中,关于存储空间的分配我们就讲到这里。

程序启动过程

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函数

我们打开ESP32 SDK中的core文件夹,里面有个main.cpp文件,打开我们就知道,app_main调用了loopTask函数,loopTask会先调用setup函数,再调用loop函数,loop函数会一直死循环,所以我们可以在setup里创建任务。

我们Arduino中的setup与loop函数就是上面的函数中调用的,这里我们也可以看出,ESP32在Arduino下不是裸奔的,是跑的FreeRTOS操作系统的!

感谢大家,关于ESP32的学习,希望大家Enjoy!

欢迎点分享、收藏、点赞、在看。

ESP32的FLASH、NVS、SPIFFS、OTA等存储分布以及启动过程相关推荐

  1. esp32 Flash分区与OTA功能简析

    升级功能对于所有的嵌入式产品都是非常重要的.尤其是当产品量产/销售阶段,已经没有条件让厂家对产品升级,因此升级方式的设计必须防呆防错以及稳定. 乐鑫ESP32作为蓝牙WIFI合一的物联网芯片,开发成产 ...

  2. ESP32 HttpServer模式下 本地OTA 例程(基于ESP-IDF类似Arduino下OTAWebUpdater例程)

    由于项目需要ESP32连接app进行OTA,为了支持AP模式下与STA模式下的本地局域网OTA功能(不需要OTA服务器). 咨询乐鑫技术支持,ESP-IDF下没有该模式的官方例程.网上也一直没有找到相 ...

  3. esp启动是什么感觉_第九章 ESP32上电后的启动过程

    目标 · 了解app_main之前ESP32干了什么 · 了解ESP32复位原因 ESP32启动总流程(原文) ESP32开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,相当于其 ...

  4. 为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

    STM32F103ZE芯片存储空间的地址映射关系图. 在MDK编译程序设置ROM和RAM地址时候发现: IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为512KB, ...

  5. NRF51822 烧录bootloader 后,需要OTA一次,才能启动App解决办法

    Nordic 51822 烧录bootloader 后,需要OTA一次,才能启动App解决办法 使用nrfjprog烧写寄存器标志位 nrfjprog --memwr 0x3FC00 --val 0x ...

  6. mini2440的nor flash与nand flash启动过程区别

    -------------------------------------------------------- 目标:祥读mini2440说明书 -------------------------- ...

  7. MariaDB 修改存储路径后启动失败问题解决

    MariaDB 修改存储路径后启动失败问题解决 参考文章: (1)MariaDB 修改存储路径后启动失败问题解决 (2)https://www.cnblogs.com/dizhiyaochang/p/ ...

  8. 达沃时代发布分布式块存储服务系统 启动存储生态圈

    10月27日,达沃时代在北京召开主题为"打造数据沃土,营造千亿生态"的新闻发布会,发布存储新品逸存B系列(YeeStor B serials)分布式块存储服务系统,同时宣告了&qu ...

  9. arm linux 存储,linux arm的存储分布那些事

    原标题:linux arm的存储分布那些事 linux arm 内存分布总览 上图是linux的arm的虚拟地址分布总览,我们按从低地址到高地址的顺序逐个描述,每项的描述包括如下的内容的组和: 地址范 ...

最新文章

  1. java datetime int_关于jodatime:Java中DateTime对象之间的小数天数
  2. win7如何取消计算机管理员权限,win7如何删除需要管理员权限的文件夹
  3. Asp.Net Core MVC控制器和视图之间传值
  4. matlab红外图像温度提取,一种基于红外热图的温度提取方法.pdf
  5. linux 查看端口 程序,linux开发:Linux下查看端口占用
  6. 利用计算机找出函数关系式,使用 CHOOSE 查找函数中类似于表的信息 - Excel公式函数运用大全...
  7. java虚拟机标志_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...
  8. 开源Scout攻击检测工具
  9. 最大公约数及最小公倍数计算
  10. attention的前世今生
  11. FPGA信号处理系列文章——相关与卷积
  12. 现代交换原理——时间接线器
  13. h5互动游戏制作方法是怎样_求h5游戏教程
  14. 运动会加油稿计算机学院150字,学校运动会加油稿150字10篇
  15. 错误: 找不到或无法加载主类 com.sxt.ceshi.Demo166
  16. Java8 通过foreach 遍历List,同时输出下标
  17. linux的pv原语
  18. 南非NRCS认证简介
  19. (co-,contra-,in-)variance in Scala, what is [+-A]
  20. 有没有比较好的建站系统可推荐?

热门文章

  1. T-Sql 实现类似访问数组变量的操作
  2. pku 3436 ACM Computer Factory ——最大流 EK
  3. 织梦DedeCMS播放本地视频文件插件
  4. 电动力学每日一题 2021/10/10
  5. Windows驱动开发-_驱动对象学习和内核处理字符串初步
  6. 第一次使用aspnet_compiler失败记录
  7. SQL Server 入门复习(2008)图解
  8. VC++ 访问数据库实例详解图解
  9. 修改IIS默认的30M
  10. ORA-12638: 身份证明检索失败 解决方法