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中的数据。、
三、执行应用程序
运行底层初始化函数,准备C语言运行环境(如设置堆栈)。
初始化FreeRTOS系统(如创建空闲任务、调度器)。
创建
app_main
任务。启动FreeRTOS调度器。
调度器开始运行
app_main
及其他任务,用户应用程序正式运行。(注:app_main
函数返回后,系统仍继续运行)。