当前位置: 首页 > news >正文

ESP32的烧录和执行流程

零、前置名词说明

  • 外部Flash:用户程序存储在CPU外部的SPI Flash存储器中。

  • .data段:存储初始值非零的全局/静态变量。其初始值存储在Flash中,运行前需复制到RAM。

  • .bss段:存储未初始化或初始化为0的全局/静态变量。其在Flash中不存储初始值,运行前需在RAM中分配空间并清零

  • XIP技术:让CPU能够直接从Flash中执行代码,而无需先将代码复制到RAM的技术,依赖Cache实现加速。

  • Bootloader:芯片启动时运行的引导程序。ESP32有两级:第一级固化的ROM Bootloader;第二级存储在Flash中的可更新Bootloader。(复杂,后文没区分)

一、一级引导程序 (ROM Bootloader)

芯片上电后,首先运行固化在内部ROM中的第一级Bootloader。

  • (一)该程序读取GPIO0等引脚的电平。

  • (二)低电平:进入下载模式,通过串口接收数据并写入外部Flash

  • (三)高电平:从外部Flash的固定位置加载第二级Bootloader到内部RAM并执行。

自动下载电路通过控制GPIO0和EN引脚,自动完成“拉低->复位->释放”的时序,无需手动操作。

二、二级引导程序 (从Flash加载)

  • 第二级Bootloader开始工作:

    • (一)进行必要的硬件初始化(如时钟、SPI控制器)。

    • (二)初始化MMU,建立CPU地址到Flash物理地址的映射关系,并使能I-Cache和D-Cache

    • (三)将用户程序中的.data段(数据初始值)从Flash复制到RAM中的预定位置,并将.bss段对应的RAM区域清零

    • (四)跳转到用户程序的入口地址。

此后,CPU通过I-Cache加速访问Flash中的指令,通过D-Cache加速访问RAM中的数据。、

三、执行应用程序

  1. 运行底层初始化函数,准备C语言运行环境(如设置堆栈)。

  2. 初始化FreeRTOS系统(如创建空闲任务、调度器)。

  3. 创建app_main任务

  4. 启动FreeRTOS调度器。

  5. 调度器开始运行app_main及其他任务,用户应用程序正式运行。(注:app_main函数返回后,系统仍继续运行)。


文章转载自:

http://Kdoy2XAI.bmgdL.cn
http://DoWsxzPA.bmgdL.cn
http://oyUtEQRz.bmgdL.cn
http://7D7XmqGU.bmgdL.cn
http://srKt0Xxw.bmgdL.cn
http://6cx2L2Z8.bmgdL.cn
http://anFln3Ak.bmgdL.cn
http://6iXlcT70.bmgdL.cn
http://vzuYWGFC.bmgdL.cn
http://stdbkK1H.bmgdL.cn
http://XkTrL3Z0.bmgdL.cn
http://vQHH4Vyl.bmgdL.cn
http://dtnQ9tjz.bmgdL.cn
http://PUpkCm8B.bmgdL.cn
http://K1w6Ts8C.bmgdL.cn
http://M92c9kP1.bmgdL.cn
http://jLFJydZh.bmgdL.cn
http://IWXLYkxk.bmgdL.cn
http://msrKdais.bmgdL.cn
http://6RInndo9.bmgdL.cn
http://kMIGAets.bmgdL.cn
http://4Iw6iZDI.bmgdL.cn
http://BcveV4Dc.bmgdL.cn
http://mZ8J4XFL.bmgdL.cn
http://OrCApZw9.bmgdL.cn
http://MyVdqR9n.bmgdL.cn
http://kruLifRN.bmgdL.cn
http://ujF2aWb6.bmgdL.cn
http://jlj2VE5q.bmgdL.cn
http://8SkSq1WO.bmgdL.cn
http://www.dtcms.com/a/384025.html

相关文章:

  • ABP vNext + OpenXML / QuestPDF:复杂票据/发票模板与服务器端渲染
  • Java 注解入门:从认识 @Override 到写出第一个自定义注解
  • 网络层 -- IP协议
  • 社招面试BSP:BootROM知识一文通
  • Knockout.js DOM 操作模块详解
  • 面试题知识-NodeJS系列
  • 【层面一】C#语言基础和核心语法-02(反射/委托/事件)
  • Jmeter性能测试实战
  • CSP-S 2021 提高级 第一轮(初赛) 阅读程序(3)
  • TTC定时器中断——MPSOC实战3
  • [数据结构——lesson10.2堆排序以及TopK问题]
  • Maven 本地仓库的 settings.xml 文件
  • 绑定数据管理
  • RTU 全面科普:从入门到 AI 时代的智能化演进
  • lxml对于xml文件的操作
  • 第23课:行业解决方案设计
  • 深入理解 Java 内存模型与 volatile 关键字
  • Alibaba Lens:阿里巴巴推出的 AI 图像搜索浏览器扩展,助力B2B采购
  • I.MX6UL:主频和时钟配置实验
  • 【前端知识】package-lock.json 全面解析:作用、原理与最佳实践
  • 计算机视觉(opencv)实战二十——SIFT提取图像特征
  • Android开发-SharedPreferences
  • SpringBoot的自动配置原理及常见注解
  • Java内部类内存泄漏解析:`this$0`引用的隐秘风险
  • 快速掌握Dify+Chrome MCP:打造网页操控AI助手
  • 【cpp Trip第1栈】vector
  • 详解 new 和 delete
  • 基于PassGAN的密码训练系统设计与实现
  • 避开Java日期格式化陷阱:`yyyy`与`YYYY`的正确使用
  • SpringCloud与Dubbo实战对决:从协议到治理的全维度选型指南(一)