ZeroOne AI
← 返回文章列表

ESP32-SOLO-1 在 ESP-IDF v5.5 下启动不断重启问题分析与解决

👁 39
分类:工业互联网

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()

最终导致芯片复位。
所以,这次重启并不是普通的:

三、为什么以前版本可以正常运行?

本项目原来使用旧版本 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

八、推荐的完整操作流程

对于本项目,建议按照下面顺序操作。

  1. 进入正确工程目录
cd E:\ESP32\Work\softAP-fixport9999
  1. 删除旧的 build
    删除:
build/
  1. 确认 Target
idf.py show-target

确保:

esp32

如果不是:

idf.py set-target esp32
  1. 重新生成 CMake
idf.py reconfigure
  1. 打开配置界面
idf.py menuconfig

此时再检查 FreeRTOS 相关配置。
6. 重新编译

idf.py build
  1. 烧录
idf.py flash
  1. 查看启动日志
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、智能制造与技术实践文章

小龙虾智能体不响应飞书群消息:飞书与智能体连接问题排查与解决

企业员工在飞书外部群 @小龙虾 却得不到任何响应,而发送消息、查询接口又都正常——问题往往不在AI模型,而在飞书事件订阅链路。本文梳理飞书与智能体之间的双向通信架构,从事件订阅、消息接收事件、机器人权限、公网Webhook到@消息解析逐层排查,配合日志与Trace ID定位故障,最终给出“能收、能理解、能处理、能回复”的完整闭环方案。

AGV物流

AGV小车的运动是怎么控制的呢?一文讲清导航与定位原理

AGV 小车如何在没有驾驶员的情况下精准完成搬运任务?本文从酒店送餐机器人场景切入,系统讲解 AGV 的四大主流导航方式(激光、视觉、GPS、惯性),并深入介绍「北斗 RTK + UWB + 视觉融合」的室内外一体化定位方案与作业调度控制,帮助读者理解 AGV 运动控制的核心原理。

工业互联网

Linux系统篇(二十二)——文件(六):目标文件与 ELF 深度解析:从编译到加载的全景揭秘

从目标文件出发,逐层解剖ELF头部、节头表与程序头表,讲透静态链接重定位、动态链接GOT/PLT以及程序从编译到加载的完整过程。

机器人自动化

手把手做ROS2机器人系统开发(七):扩展ROS2软件包接口

上一讲讲解了如何创建自定义 msg 和 srv 文件对应的接口软件包。本章节延续该内容,进一步扩展 ROS2 软件包的接口:将自定义消息直接定义在节点软件包中,实现软件包功能的扩展。通过本讲,大家可以掌握"接口随包定义、随包编译"的工程化开发方式。

AI视觉

树莓派部署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视觉系统打下基础。

工业AI

RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成

本文系统讲解RAG的完整工作流程:为什么不能把整份文档直接交给大模型、哪些场景适合RAG、分片Chunking(含常见分片方式对比表与段落感知分片器代码)、索引与Embedding、召回(余弦相似度与BM25混合检索)、重排(BGE Reranker)、生成(Prompt组装),并给出一个可运行的Python端到端Demo与常见问题排查指南。

评论(0)