ESP32-C3无FreeRTOS自定义应用启动及函数疑问咨询
ESP32-C3 二级引导加载启动相关问题解答
1. 两个call_start_cpu0函数的实际使用场景
这两个函数分属不同执行阶段,不会产生冲突:
- 位于
bootloader_start.c中的call_start_cpu0属于二级引导加载程序(bootloader.elf),是bootloader自身的启动入口,负责完成硬件初始化、从闪存加载应用镜像到内存、验证镜像有效性,最后跳转到应用镜像的入口地址。 - 位于
cpu_start.c中带IRAM_ATTR属性的call_start_cpu0属于应用程序(hello_world.elf),是应用镜像的启动入口。当bootloader完成加载后,会跳转到这个函数,执行应用层面的初始化(比如外设初始化、中断向量表设置),最终进入用户自定义的主逻辑。
二者分别编译到不同的镜像文件,运行在完全独立的阶段,因此各自被对应阶段的代码调用。
2. 无FreeRTOS的二级引导加载应用开发说明
ESP-IDF默认依赖FreeRTOS,但可以基于二级引导加载程序开发裸机(无RTOS)应用,核心步骤如下:
- 禁用FreeRTOS组件:在项目的
menuconfig中关闭CONFIG_FREERTOS_ENABLE,或通过CMakeLists.txt排除freertos组件,避免链接FreeRTOS相关代码。 - 修改应用启动流程:修改
cpu_start.c中的启动逻辑,移除所有与FreeRTOS相关的调用(比如esp_start_free_rtos),替换为自定义的初始化代码和主循环。需要自行完成:- 基本硬件初始化(时钟、外设、中断向量表)
- 内存管理(若需要,可实现简单的裸机内存分配器,或直接使用静态内存)
- 主循环逻辑(替代FreeRTOS的任务调度,直接执行用户业务代码)
- 保持bootloader正常配置:二级引导加载程序仅负责加载和验证应用镜像,无需针对无RTOS场景修改bootloader配置,确保bootloader分区正常烧录即可。
- 参考裸机启动代码:可以参考ESP-IDF中
cpu_start.c的非RTOS相关部分,剥离FreeRTOS依赖后,构建自己的启动流程。
内容的提问来源于stack exchange,提问作者Andrea Acquaviva
相关产品推荐
相关产品推荐

