对于esp32,其开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,这在没有调用FreeRTOS的系统中相当于函数main,但其实在app_main之前,系统还有一段初始化的过程,其大致可以分为以下三个过程:
ROM中的第一级引导加载程序将闪存偏移0x1000的第二级引导加载程序映像加载到RAM(IRAM和DRAM)。
第二级引导程序从闪存加载分区表和主应用程序映像。主应用程序包含RAM段和通过闪存缓存映射的只读段。
主应用程序图像执行。此时可以启动第二个CPU和RTOS调度程序。
以下将详细介绍这三个过程
STEP1:
第一阶段引导程序
系统first-stage bootload启动,对于系统的first-stage bootloader,其主要任务是负责从Flash的地址0X1000开始加载bootloader镜像到RAM中(此工程的bootloader文件由esp-idf中的component 目录下的bootloader\subproject\main\bootloader_start.c可以查看源码),在SoC复位后,PRO CPU将立即开始运行,执行复位向量代码,而APP CPU将保持复位。在启动过程中,PRO CPU执行所有初始化。call_start_cpu0应用程序启动代码功能中的APP CPU复位被取消置位。复位向量代码位于ESP32芯片掩码ROM中的地址0x40000400,不能修改。
从复位向量调用的启动代码通过检查GPIO_STRAP_REG(gpio_reg.h定义的)引导引脚状态的寄存器来确定引导模式。根据复位原因,发生以下情况:
从深度睡眠复位:如果值为RTC_CNTL_STORE6_REG非零,并且RTC存储器的CRC值RTC_CNTL_STORE7_REG有效,RTC_CNTL_STORE6_REG则将其用作入口点地址并立即跳转到其中。如果RTC_CNTL_STORE6_REG为零,或RTC_CNTL_STORE7_REG包含无效的CRC,或者一旦调用通过RTC_CNTL_STORE6_REG返回的代