基于ESP32S3的FreeRTOS之基本运行原理(一)
学习任务
- 了解Free RTOS的启动机制
- 掌握task
- 掌握list
- 掌握queue
基本流程
基本应用程序启动流程
框架结构
- First stage bootloader
位于只读的ROM,主动在flash的0x1000偏移地址处加载second stage bootloader 到RAM(IRAM & DRAM)中。
位于components的bootloader文件夹中,都为build文件。
- Second stage bootloader
从flash中加载分区表和主程序镜像。主程序中包含RAM段和通过flash高速缓存映射的只读段。
位于components/bootloader_support文件夹中,包含了各种芯片的初始化启动代码。
- 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) ; 应用程序入口