ESP32-SOLO-1 在 ESP-IDF v5.5 下启动不断重启问题分析与解决
ESP32 工程升级到 ESP-IDF v5.5 后烧录成功,上电却不断重启?日志提示 Running on single core variant of a chip, but app is built with multi-core support。本文定位根因:ESP32-SOLO-1 是单核芯片,工程却按多核 ESP32 编译,cpu_start 启动第二核失败触发 abort 复位;同时工程目录变化导致 build/CMakeCache.txt 缓存旧路径,menuconfig 无法正常配置。给出完整解决流程:清理 build → 确认 Target → 重新生成 CMake → 编译烧录,并建议用 sdkconfig.defaults 固化稳定配置。
一、问题现象
在将原有 ESP32 工程升级到 ESP-IDF v5.5 后,程序烧录成功,但是 ESP32 上电后不断重启。
串口监视器可以看到类似以下日志:
I (388) boot: Loaded app from partition at offset 0x10000
I (388) boot: Disabling RNG early entropy source...
I (398) cpu_start: Multicore app
E (398) cpu_start: Running on single core variant of a chip, but app is built with multi-core support.
E (401) cpu_start: Check that CONFIG_FREERTOS_UNICORE is enabled in menuconfig
abort() was called at PC 0x400d27a4 on core 0
随后出现:
Backtrace:
...
start_other_core
...
call_start_cpu0
设备进入:
启动 → 异常 → abort → 重启 → 启动 → 异常 → 重启
的循环。
二、问题定位
从日志中最重要的一句话是:
Running on single core variant of a chip, but app is built with multi-core support.
它的含义是:
当前实际运行的芯片是单核芯片,但是编译出来的应用程序按照多核 ESP32 进行了编译。
本项目使用的是:
ESP32-SOLO-1
ESP32-SOLO-1 属于单核 ESP32。
因此程序启动时,ESP-IDF 发现:
实际硬件:单核
编译配置:双核
于是启动代码尝试启动第二个 CPU:
start_other_core()
但是实际芯片没有第二个 CPU,因此调用:
abort()
最终导致芯片复位。
所以,这次重启并不是普通的:
- 看门狗
- 电源不稳定
- UDP 通讯异常
- 内存不足
- 应用程序死循环
而是系统启动阶段的 CPU 配置不匹配。
三、为什么以前版本可以正常运行?
本项目原来使用旧版本 ESP-IDF 时可以正常运行。
升级到:
ESP-IDF v5.5
之后出现问题。
这说明需要重点检查 ESP-IDF 升级以后工程配置是否发生变化。
尤其是:
sdkconfig
build/
CMakeCache.txt
ESP-IDF Target
FreeRTOS CPU 配置
这些配置并不是简单地替换 ESP-IDF 目录就可以保证完全一致。
四、首先确认 ESP32 Target
ESP32-SOLO-1 使用的 ESP-IDF Target 仍然是:
esp32
这里容易产生误解。
ESP32-SOLO-1 虽然是单核,但是它不是:
esp32c3
也不是:
esp32s2
因此工程 Target 应该仍然是:
CONFIG_IDF_TARGET="esp32"
可以使用:
idf.py show-target
检查当前工程。
如果 Target 配置异常,可以重新设置:
idf.py set-target esp32
五、为什么 menuconfig 中找不到 CONFIG_FREERTOS_UNICORE?
这是本次问题排查中比较容易困惑的一点。
日志明确提示:
Check that CONFIG_FREERTOS_UNICORE is enabled in menuconfig
但是在 ESP-IDF v5.5 的 SDK Configuration Editor 中,却找不到:
Run FreeRTOS only on first core
也就是:
CONFIG_FREERTOS_UNICORE
这时候不能简单认为“找不到配置项就是没有问题”。
需要首先确认:
当前 menuconfig 是否正常加载了这个工程。
因为本项目同时出现了 CMakeCache 错误。
六、真正影响 menuconfig 的 CMakeCache 错误
升级/复制工程以后,出现了如下错误:
CMake Error: The current CMakeCache.txt directory
E:/ESP32/Work/softAP-fixport9999/build/CMakeCache.txt
is different than the directory
e:/ESP32/Work/softAP/build
where CMakeCache.txt was created.
随后又出现:
The source
"E:/ESP32/Work/softAP-fixport9999/CMakeLists.txt"
does not match the source
"E:/ESP32/Work/softAP/CMakeLists.txt"
used to generate cache.
这个问题非常关键。
原来的工程目录是:
E:/ESP32/Work/softAP
后来工程变成:
E:/ESP32/Work/softAP-fixport9999
但是:
build/CMakeCache.txt
仍然保存着旧工程路径。
因此 CMake 发现:
旧工程:
E:/ESP32/Work/softAP
当前工程:
E:/ESP32/Work/softAP-fixport9999
两者不一致,于是拒绝继续配置。
最终导致:
SDK Configuration Editor
也无法正常运行。
因此在检查 CONFIG_FREERTOS_UNICORE 之前,必须先解决 CMake 工程缓存问题。
七、正确清理工程
最简单可靠的方法是删除当前工程的:
build/
例如:
E:\ESP32\Work\softAP-fixport9999\build
删除整个 build 目录。
也可以执行:
idf.py fullclean
但是如果工程目录已经发生过变化,直接删除 build 往往更加可靠。
然后重新配置:
idf.py reconfigure
再重新编译:
idf.py build
最后烧录:
idf.py flash
八、推荐的完整操作流程
对于本项目,建议按照下面顺序操作。
- 进入正确工程目录
cd E:\ESP32\Work\softAP-fixport9999
- 删除旧的 build
删除:
build/
- 确认 Target
idf.py show-target
确保:
esp32
如果不是:
idf.py set-target esp32
- 重新生成 CMake
idf.py reconfigure
- 打开配置界面
idf.py menuconfig
此时再检查 FreeRTOS 相关配置。
6. 重新编译
idf.py build
- 烧录
idf.py flash
- 查看启动日志
idf.py monitor
九、不要直接修改应用代码解决这个问题
这个问题发生在:
cpu_start
阶段。
也就是说,程序甚至还没有真正进入正常的应用逻辑。
因此下面这些代码通常不是解决方案:
while(1)
或者:
vTaskDelay()
也不是 UDP、Wi-Fi、TCP、GPIO 等应用代码导致的。
正确的解决方向应该是:
芯片型号
↓
ESP-IDF Target
↓
sdkconfig
↓
FreeRTOS CPU 配置
↓
重新生成 CMake
↓
重新编译
↓
重新烧录
十、如何判断问题是否已经解决
解决以后,启动日志不应该再出现:
Running on single core variant of a chip,
but app is built with multi-core support.
也不应该再出现:
start_other_core
以及:
abort() was called
正常情况下应该继续进入应用程序初始化,例如:
app_main()
以及项目自己的:
WiFi init
UDP init
GPIO init
...
十一、建议保留一份稳定配置
由于这个项目以前在旧版 ESP-IDF 下运行正常,而升级 ESP-IDF 后出现配置问题,后续建议将关键配置明确保存。
可以在工程中维护:
sdkconfig.defaults
并记录:
ESP-IDF版本
芯片型号
Target
FreeRTOS配置
Flash配置
Partition Table
Wi-Fi配置
例如:
ESP32-SOLO-1
Target: esp32
ESP-IDF: v5.5
这样以后更换电脑、复制工程或者升级 ESP-IDF 时,可以快速恢复正确配置。
十二、工程升级 ESP-IDF 时的注意事项
ESP-IDF 工程升级时,不建议简单地:
复制旧工程
↓
修改 ESP-IDF 路径
↓
直接 build
特别是工程目录发生变化时,旧的:
build/
CMakeCache.txt
可能保存旧路径。
推荐流程:
备份工程
↓
确认芯片型号
↓
确认 ESP-IDF 版本
↓
删除 build
↓
重新设置 Target
↓
重新生成 CMake
↓
检查 sdkconfig
↓
重新编译
↓
重新烧录
↓
检查启动日志
十三、本次问题的核心结论
本次 ESP32-SOLO-1 不断重启的核心问题可以归纳为:
ESP32-SOLO-1
│
│ 单核
↓
实际硬件只有 CPU0
│
×
│
工程却按照多核 ESP32 编译
│
↓
cpu_start 尝试启动 CPU1
│
↓
start_other_core()
│
↓
abort()
│
↓
芯片复位
│
└────────→ 无限重启
而在排查过程中又发现:
工程目录发生变化
↓
build/CMakeCache.txt 保存旧路径
↓
CMake 配置失败
↓
SDK Configuration Editor 无法正常工作
↓
无法正常检查/修改工程配置
因此正确的解决思路不是单纯修改某一行代码,而是:
先清理 CMake 缓存,再确认 ESP32-SOLO-1 的 Target 和单核配置,最后重新生成、编译和烧录整个工程。
对于 ESP32-SOLO-1 + ESP-IDF v5.5 项目,尤其需要注意 芯片实际单核能力与应用编译配置必须保持一致。
推荐阅读
更多工业 AI、智能制造与技术实践文章
TRIO-Basic 从入门到精通(十四):Trio 实现单位置轴多色标捕捉
本教程介绍Trio控制器多色标捕捉方案:通过ADDAX将实体轴位置叠加到虚拟轴,对虚拟轴执行REGIST色标捕捉,突破物理通道数量限制,实现单位置轴多路色标同时捕捉,满足印刷包装行业套准控制需求。
树莓派部署YOLOv8手势检测实战:USB IMX378摄像头 + Python + PyTorch + ONNX Runtime + Systemd开机自动运行
本文面向树莓派AI视觉、Python人工智能、YOLOv8目标检测初学者,以树莓派部署手势检测项目为案例,完整介绍从USB IMX378摄像头安装、Miniconda环境配置、Python虚拟环境创建、YOLOv8依赖安装,到手势检测程序Systemd开机自动运行的完整流程。在Raspberry Pi 5 / ARM64(aarch64)环境下建立独立的yolov8-env环境,安装PyTorch、Ultralytics、ONNX Runtime、NumPy等AI视觉组件,最后通过Linux systemd使fatigueDetect.py开机自动运行,实现无需手工登录的AI视觉自动检测,为后续手势识别、人体检测、疲劳驾驶检测、工业视觉检测与边缘AI视觉系统打下基础。
YOLO目标检测模型调参入门:从训练参数到检测效果优化
YOLO目标检测模型调参入门指南:详解 epochs、imgsz、batch、模型大小、conf、IoU 等核心参数的作用与调节方法,给出工业视觉、疲劳驾驶、缺陷检测等 AI 项目的调参顺序与实验对比思路,帮助初学者在精度、速度与显存之间找到平衡。
深入理解TCP协议(二):TCP可靠传输与高效通信机制详解
本文深入TCP的七大核心工作机制:确认应答、超时重传、滑动窗口、流量控制、拥塞控制、延迟应答与捎带应答。详解丢包的本质与去重、超时时间如何确定、滑动窗口的发送流程与空间复用、快速重传、零窗口探测、窗口扩大因子、慢启动与拥塞避免,以及各机制如何协同实现TCP既可靠又高效的传输,为理解三次握手与四次挥手打下基础。
TRIO-Basic 从入门到精通(五):直线与圆弧插补指令的使用
本文讲解 TRIO-Basic 三大运动指令:MOVE 相对移动、MOVEABS 绝对移动与 MOVECIRC 平面圆弧插补,给出各自的语法格式、完整可运行的代码示例(含轴参数段与矩形圆角轮廓插补示例),并说明增益参数的使用前提,帮助开发者快速上手多轴轨迹编程。
树莓派推送RTSP视频流实战:FFmpeg + rtsp-simple-server(MediaMTX)搭建局域网视频直播服务
本文面向树莓派视频流、Python视觉开发、RTSP视频监控和边缘AI视觉初学者,介绍如何在Raspberry Pi上搭建简单、稳定的RTSP视频流服务。项目采用FFmpeg + rtsp-simple-server(MediaMTX)方式,将树莓派摄像头采集的视频转换并推送到RTSP服务器,再由电脑、NVR、VLC、OpenCV或AI视觉程序访问。文章从安装FFmpeg并验证版本开始,下载适用于ARM64架构的MediaMTX v1.8.1,配置Linux Systemd服务实现RTSP服务器开机自启,最后将摄像头视频推送到RTSP地址,形成树莓派摄像头 → FFmpeg → RTSP服务器 → 客户端播放/AI检测的完整视频流架构。
