关于 ESP-IDF 编程的一些说明
关于 ESP-IDF 编程的一些说明
应用启动流程
本文档说明了在调用 ESP-IDF 应用程序的 app_main
函数之前发生的一些步骤.
启动过程如下:
1. 位于 ROM 中的第一阶段引导程序将第二阶段引导程序映像从 flash 0x1000 地址加载到 RAM( IRAM 和 DRAM ).
2. 第二阶段引导程序从 flash 中加载分区表和主应用程序映像.主应用程序包含 RAM 段和通过 flash cache 映射的只读段.
3. 主应用程序映像执行.此时,可以启动第二个 CPU 和 RTOS 调度器.
以下各节将详细介绍此过程.
第一阶段引导程序
SoC 复位后,PRO CPU 会立即开始运行,执行复位向量代码,而 APP CPU 将保持复位状态. 在启动过程中, PRO CPU 会进行所有有关的初始化.APP CPU 复位状态在应用程序启动代码的 call_start_cpu0
函数中被取消.复位向量代码位于 ESP32 芯片掩模 ROM 中的 0x40000400 地址,并且无法修改.
复位向量调用的启动代码通过检查 GPIO_STRAP_REG
寄存器的引导引脚状态来确定引导模式.根据复位原因,有以下情况:
- 从深度睡眠(
deep sleep
)模式复位:如果RTC_CNTL_STORE6_REG
中的值非零,并且RTC_CNTL_STORE7_REG
中的 RTC 存储器的 CRC 值有效,则使用RTC_CNTL_STORE6_REG
作为入口地址并立即跳转到该地址.如果RTC_CNTL_STORE6_REG
为零,或者RTC_CNTL_STORE7_REG
包含无效的 CRC 值,或者通过RTC_CNTL_STORE6_REG
调用的代码执行完毕,则继续启动,就像上电复位一样.注意:此时若要运行自定义的代码,需要提供深度睡眠存根机制.请参阅深度睡眠文档. - 对于上电复位,软件 SOC 复位和看门狗 SOC 复位:检查
GPIO_STRAP_REG
寄存器,是否要求 UART 或 SDIO 下载模式.如果是这种情况,配置 UART 或 SDIO,并等待下载代码.否则,继续启动,就好像是由于软件 CPU 复位. - 对于软件 CPU 复位和看门狗 CPU 复位:根据 EFUSE 值配置 SPI flash,并尝试从 flash 中加载代码.在下面的段落中会更详细地描述了该步骤.如果从 flash 中加载代码失败,解压 BASIC 解释器到 RAM 中并启动它.请注意,发生这种情况时 RTC 看门狗仍然是开启的,因此除非解释器接收到任何输入,否则看门狗将在几百毫秒内复位 SOC,重复整个过程.如果解释器收到来自 UART 的任何输入,它将禁用看门狗.
应用程序二进制映像从 flash 的 0x1000 地址开始加载. 闪存的第一个 4kB 扇区用于存储安全引导IV和应用程序映像的签名.有关详细信息,请查看安全启动文档.
第二阶段引导程序
在 ESP-IDF 中,位于 flash 0x1000 地址的二进制映像是第二阶段引导程序. 第二阶段引导程序源代码可在 ESP-IDF 的 components/bootloader
目录中找到