ESP32-P4 --- 启动流程
执行一级引导程序(内含复位向量代码) |
根据复位原因及 GPIO_STRAP_REG 寄存器的值确定启动模式,比如 UART 下载模式、从 FLASH 加载二级引导程序执行 |
加载二级引导程序,执行入口函数call_start_cpu0() | 根据分区表的配置,加载应用程序 |
通过应用程序二进制文件的头部找到入口地址 call_start_cpu0() ,并跳转到该地址执行 |
固化在芯片ROM 一级引导程序 在 PRO CPU 执行 |
程序位于 components/bootloader 二级引导程序 |
程序位于 components\esp_system\port\cpu_start.c 应用程序:硬件和基本 C 语言运行环境的端口初始化 |
||
在 call_start_cpu0() 内调用 start_other_core() 启动 APP CPU,APP CPU 随即执行 call_start_cpu1()
|
call_start_cpu1() 自旋, 等待变量 s_resume_cores 置一后才能往下执行 |
call_start_cpu0() 函数最后执行 start_cpu0_default() - 最后执行freertos task
call_start_cpu1() 函数最后执行 start_cpu_other_cores() - 最后一直delay
|
start_cpu0_default() 的 do_secondary_init() 设置全局变量致使 APP CPU 退出自旋 | 启动调度器,执行第一个task(main_task),其内调用app_main |
APP CPU 启动,从 call_start_cpu1() 开始执行 |
应用程序:软件服务和 FreeRTOS 的系统初始化 | 应用程序:运行主任务并调用 app_main |
一级引导程序的 log
ESP-ROM:esp32p4-20230811 Build:Aug 11 2023 rst:0xc (SW_CPU_RESET),boot:0x31f (SPI_FAST_FLASH_BOOT) SPI mode:DIO, clock div:1 load:0x4ff2bbd0,len:0x73c load:0x4ff2dbd0,len:0x20ec load:0x4ff34cd8,len:0x1748 entry 0x4ff2bc40