老宇哥带你玩转 ESP32:10 ESP32存储分布以及启动过程-程序员宅基地

技术标签: python  java  linux  android  编程语言  

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

ESP32 for Arduino存储分布

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

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

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

afd4f54a8a404238a0393e2b0c1161d3.png

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

23673c127bcec88003b54103cfbccd5c.png

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

分区表说明

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

164162a288de7fa00e4bafc3418683fb.png

  • 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是怎么烧录的:

b39eea6c6f2e0c66b1269831e889f848.png

如上图所示,根据每个分区的地址,将用到的各个分区的内容依次烧录进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里创建任务。

f29f204cf52365f44bcf63d480d800e8.png

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

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

b9a1f2fcc85b14ad05f4517104b084a3.png

老宇哥带你玩转 ESP32:05 ADC用起来这也太简单了吧

ea3af02f22192c664038c12972c1f652.png

老宇哥带你玩转 ESP32:04 串口玩起来是真方便

39367abc394aa745d01a49f320f20cd3.png

老宇哥带你玩转ESP32:03 GPIO数字输入与数字输出

370eda43114d306c84ebb4dc40095417.png

老宇哥带你玩转ESP32:02使用VSCode+PlatformIO搭建开发环境

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/karaxiaoyu/article/details/123173651

智能推荐

用switch来实现简易计算器的加减乘除_用switch语句编写加减乘除计算器-程序员宅基地

文章浏览阅读2.5k次。package com.jing.struct;import java.util.Scanner;public class Dome08 { //简易计算机实现加减乘除 public static void main(String[] args) { Scanner scanner = new Scanner(System .in) ; System.out.println("请输入你要计算的数,按空格继续" ); //输入第一个_用switch语句编写加减乘除计算器

idapython 攻防世界 no strings attached_idapython strings-程序员宅基地

文章浏览阅读118次。https://blog.csdn.net/weixin_43281394/article/details/112341592_idapython strings

(后端)如何将数据库的表导出生成Excel?-程序员宅基地

文章浏览阅读736次。1.如何通过元数据拿到数据库的信息?2.如何用Java生成Excel表?3.将数据库中的表导出生成Excel案例如何通过元数据拿到数据库的信息元数据:描述数据的数据Java中使用元数据的两个方法DatabaseMetaData 通过连接可以拿到的信息:数据库软件,所有数据库名,所有数据库里面的表名,描述数据库的元数据ResultSet..._数据库数据自动生成excel

Linux/Windows下OPC ua -- 下_miloopclinux 服务器-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏2次。读取和写入首先要创建一个variant,将读写的值和节点绑定,指定节点需要节点id和作用域idvoid* CXNOpc::GetOpcValueNumberic(UA_UInt16 nsIndex, UA_UInt32 identifier, int Type, int& length){ UA_Variant *val = UA_Variant_new(); if(..._miloopclinux 服务器

表单源码php,PHP微信表单源码解密开源版 微擎原版功能模块 多功能表单 微信万能表单2.8WEUI高级版...-程序员宅基地

文章浏览阅读974次。本模块主要用于实现各行业的报名、预约、加盟申请、调查等应用在微信端的实现,支持创建N个表单主题,每个表单主题功能设置均独立。01.自定义表单模型(自定义字段支持字符串、数字、单选、多选、下拉、日历、时间、邮件、省市区、上传图片),每个自定义字段支持自定义描述(输入提示),上传图片支持自定义示例图(Amaze版不支持);02.支持多图上传;(Amaze版不支持)03.录音:在线录制60秒语音,使用第..._万能表单源码

郸城计算机学校,郸城科技职业中等专业学校-程序员宅基地

文章浏览阅读116次。郸城科技职专,是经省教育厅备案,周口市教育局批准的一所正规化职业中等专业学校,目前拥有两个校区,老校区位于郸城县交通路与西环路交叉口,新汽车站西400米,新校区位于郸城县科技大道西段与公园西路交汇处,交通十分便利。郸城科技职业中等专业学校办学情况学校于2008年与北京大学青鸟集团IT教育联合,依托高校IT优势资源,享受先进教学理念,普通高中管理模式,职业学校教学模式。学校具有较强的师资队伍,先进的..._郸城县科技职专待遇怎么样

随便推点

Ubuntu下安装Python的Tkinter和Pmw库_unbuntu pmw-程序员宅基地

文章浏览阅读2k次。在Linux下,如果需要编写界面应用,并且此界面应用对性能的要求不是很高,一般可以使用Python解决。Python中可以使用自带的Tkinter库或者是第三方的Wxpython库,当然Tkinter的移植性更好。 安装Tkinter非常简单,只需要输入下面命令即可:sudo apt-get install python-tk 即可安装成功Tkinter。 下_unbuntu pmw

苹果生产日期对照表2020_苹果官方确认:部分批次AirPodsPro会有声音故障问题-程序员宅基地

文章浏览阅读5.4k次。苹果近期在其官网技术支持页面发布了「适用于声音问题的 AirPods Pro 服务计划」,表示已经确认一小部分的 AirPods Pro 可能会遇到声音问题。受影响设备的生产日期为 2020 年 10 月之前。受影响的 AirPods Pro 可能会出现以下一种或多种状况:● 发出爆裂声或静电噪音,并在嘈杂环境中、运动时或通话时增大;● 主动降噪功能无法正常工作,出现例如缺失低音效果,或..._airpodspro生产批次

IDEA maven 项目修改代码不生效,mvn clean、install 后才生效_idea重启程序不生效-程序员宅基地

文章浏览阅读2.4w次,点赞12次,收藏14次。现象正常情况下修改完代码,运行项目就会立即生效的。但是突然有一天发现运行的还是老的代码,新代码根本没有生效。通过 mvn clean、 install 后,再运行就可以了,但是这样明显是不正常的,而且也非常麻烦。解决方案重新 import project 导入项目,就可以解决问题。..._idea重启程序不生效

Js中JSON.stringify()与JSON.parse()与eval()详解及使用案例_json.stringify去转义-程序员宅基地

文章浏览阅读209次。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。因为采用独立于语言的文本格式,也使用了类似于C语言家族的习惯,拥有了这些特性使使JSON称为理想的数据交换语言,作用是易于阅读和编写,同时也易于机器解析和生成(一般用于网络传输速率)(1)JSON.parse函数作用:将json字符串转换成json对象。语法:JSON.parse(text[,reviver]).参数:text 必须;一个有效的js..._json.stringify去转义

python 实现81个人脸关键点实时检测_面部关键点检测 python-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏24次。python 实现81个人脸关键点实时检测文章目录:一、81个关键点介绍二、81 个关键点的使用该库也是基于dlib实现的,还有face_recognition也同样是基于dlib来实现的一、81个关键点介绍先来仔细看一看这只斯嘉丽,脸上81个关键点的分布:0-67是dlib既有的68个脸部关键点;68-80是程序猿新增的13个前额关键点。程序猿说,他是从Patrick Hube..._面部关键点检测 python

buuctf - [网鼎杯 2020 青龙组]AreUSerialz-程序员宅基地

文章浏览阅读2.4k次,点赞11次,收藏13次。1.题目源码<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler { protected $op; protected $filename; protected $content; function __construct() { $op = "1"; $filename = "/tmp/tmpfile"; $content_[网鼎杯 2020 青龙组]areuserialz

推荐文章

热门文章

相关标签