学习任务

参考官方文档
参考Michael_ee老师教学

  • 了解Free RTOS的启动机制
  • 掌握task
  • 掌握list
  • 掌握queue

基本流程

基本应用程序启动流程

框架结构

  1. First stage bootloader

位于只读的ROM,主动在flash的0x1000偏移地址处加载second stage bootloader 到RAM(IRAM & DRAM)中。

位于components的bootloader文件夹中,都为build文件。

  1. Second stage bootloader

从flash中加载分区表和主程序镜像。主程序中包含RAM段和通过flash高速缓存映射的只读段。

位于components/bootloader_support文件夹中,包含了各种芯片的初始化启动代码。

  1. Application startup(应用程序入口)

第二个CPU和RTOS的调度器启动。

位于components/freertos文件夹中,核心文件为==list.c #F44336==、==queue.c #FF5722==、==task.c #FF9800==。其中port文件夹中针对不同系统的移植代码。

针对不同内核的移植代码

应用程序的调用顺序

位于 ==freeRTOS #00BCD4==
-> app_main()
-> 【port_common.c】main_task()
->【port_common.c】xTaskCreatePinnedToCord() 创建了一个main_task
-> 在esp_startup_start_app_common()中利用xTaskCreatePinnedToCord创建main_task()
-> 【port.c】esp_startup_start_app_common() 此函数主要用于创建对所有task的调度操作,涉及到优先级
位于==esp-system #00BCD4==
-> 【startup.c】start_cpu0_default() 该函数主要初始化核心组件及服务。
-> 【startup.c】弱连接到start_cpu0(), 该函数中涉及到硬件初始化
-> 【startup_internal.h】g_startup_fn[] 数组可以调用不同的cpu初始化
-> 【stratup_internal.h】#define SYS_STARTUP_FN() 宏定义
-> 【cpu_start.c】call_start_cpu0(),由于esp32只有一个内核,所以只会被cpu0调用,这个函数同时调用了esp_mspi_pin_init用于初始化esp,,以及调用了bootloader
-> 【sections.id.in链接文件】ENTRY(call_start_cpu0) ; 应用程序入口

task创建了一个main_task

start_cpu0()弱连接