ESP32启动流程

ESP32启动流程

官方文档参考 ESP32启动流程解释 FreeRTOS是怎样调用应用程序入口的 ?主要关注app_main()在哪里被调用。 app_main()在文件esp-idf/components/freertos/app_startup.c被调用: 调用流程,路径基于esp-idf/component,版

官方文档参考

ESP32启动流程解释


FreeRTOS是怎样调用应用程序入口的 ?主要关注app_main()在哪里被调用。

app_main()在文件esp-idf/components/freertos/app_startup.c被调用:
截屏2024-06-11 14.05.24.png

调用流程,路径基于esp-idf/component,版本v5.4-dev

components/bootloader/subproject/main/ld/esp32/bootloader.ld => ENTRY(call_start_cpu0) ->
esp_system/port/cpu_start.c => call_start_cpu0() -> // 多内核情况存在多个cpu启动入口程序,根据宏定义来确定从哪个cpu启动
esp_system/include/esp_private/startup_internal.h => #define SYS_STARTUP_FN() ((*g_startup_fn[(esp_cpu_get_core_id())])()) ->
esp_system/startup.c => const sys_startup_fn_t g_startup_fn[1] = { start_cpu0 }; -> // startup function数组,可以调用不同的cpu初始化程序
esp_system/startup.c => void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))) __attribute__((noreturn)); ->
esp_system/startup.c => start_cpu0_default() ->
freertos/app_startup.c => esp_startup_start_app() -> // 用xTaskCreatePinnedToCore()创建main_task()
freertos/app_startup.c => main_task() ->
freertos/app_startup.c => app_main()
freertos/app_startup.c => vTaskStartScheduler() // 对所有FreeRTOS任务根据不同的优先级别进行切换调度
Comment