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函数返回后,系统仍继续运行)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值