You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xiao ESP32C3核心转储闪存配置损坏问题求助

问题:Xiao ESP32C3状态机初始IdleState反复触发Store access fault崩溃

错误日志

Rebooting...
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x3 (RTC_SW_SYS_RST),boot:0xe (SPI_FAST_FLASH_BOOT)
Saved PC:0x40048b82
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5820,len:0xf64
load:0x403cc710,len:0x73c
load:0x403ce710,len:0x2eac
entry 0x403cc710
Guru Meditation Error: Core  0 panic'ed (Store access fault). Exception was unhandled.

Core  0 register dump:
MEPC    : 0x4038608c  RA      : 0x40386a0c  SP      : 0x3fcde250  GP      : 0x3fc8c200
TP      : 0x00000000  T0      : 0x4005890e  T1      : 0x40386292  T2      : 0x00000000
S0/FP   : 0x000007d0  S1      : 0x3fc8e000  A0      : 0x00000000  A1      : 0x00000000
A2      : 0x00000003  A3      : 0x00000008  A4      : 0x3fc8e000  A5      : 0x00000000
A6      : 0x00010000  A7      : 0x40384416  S2      : 0x3c034000  S3      : 0x00000000
S4      : 0x0000edd8  S5      : 0x3c030000  S6      : 0xffff0000  S7      : 0x4038133e
S8      : 0x00020020  S9      : 0x00010020  S10     : 0x00000005  S11     : 0x3fcde3c0
T3      : 0x3fc8fa38  T4      : 0xffff0000  T5      : 0x00000000  T6      : 0x00000000
MSTATUS : 0x00001881  MTVEC   : 0x40380001  MCAUSE  : 0x00000007  MTVAL   : 0x00000152
MHARTID : 0x00000000 

(stack memory displays here memory adresses... and then this)

ELF file SHA256: 8a3e19fac03e38d8

E (429) esp_core_dump_flash: Core dump flash config is corrupted! CRC=0x7bd5c66f instead of 0x0
E (437) esp_core_dump_elf: Elf write init failed!
E (442) esp_core_dump_common: Core dump write failed with error=-1

现象描述

状态机能正常运行,但初始IdleState状态下,崩溃日志与Waiting for HANDSHAKE input...提示交替出现,直到在串口输入切换状态指令后恢复正常。

排查过程

注释chip类loop函数中的performState()和handle()函数体后,崩溃仍触发;添加测试函数printState()后,问题依然存在。

相关代码

chip.cpp

#include "chip.h"
#include "Arduino.h"
#include <string>

chip::chip()
    : reading_pin(D0), power_pin(D2), pwmFreq(5000), pwmResolution(8), 
     idleState(), pairedState(), genState(), currentState(&idleState){
    

    delayMicroseconds(1000); // Stabilize serial 


    pinMode(reading_pin, INPUT);
    ledcAttach(power_pin, pwmFreq, pwmResolution);

}


void chip::loop() {
    this->performState();
    this->handle(); // checks serial monitor for requests
    //this->printchip();

}

void chip::performState(){
    if (currentState == nullptr) {
        Serial.println("Error: Current state is null.");
        return;
    }
    currentState->perform(this);
}

void chip::handle() {
    if (currentState == nullptr) {
        Serial.println("Error: Current state is null.");
        return;
    }
    currentState->handleRequest(this);

}

void chip::setState(State* newState) {

    if (newState == nullptr) {
        Serial.println("Error: Attempted to set state to null.");
        return;
    }

    currentState = newState; // change states

}

/*
void chip::printchip(){
  currentState->printState();

}*/

IdleState.cpp

#include "idlestate.h"
#include "chip.h"
#include "Arduino.h"

void IdleState::perform(chip* esp) {
  

    Serial.println("Waiting for HANDSHAKE input...");
    delayMicroseconds(1000); // Let the user see the message 
}

void IdleState::handleRequest(chip* esp) {
  
    if (Serial.available() > 0) {
        String input = Serial.readStringUntil('\n');

        if (input.equals("HANDSHAKE")){
            
            // blink as sucessfull handshake
            for (int i = 0; i < 3; i++) {
                esp->ledWrite(255);
                delay(100); 
                esp->ledWrite(0);
                delay(100);
                esp->ledWrite(255);
                delay(100);
                esp->ledWrite(0);
                delay(100);
            }
            Serial.println("Comms established! Device paired.\nWaiting for GEN input");
            esp->setState(&esp->pairedState);
        }
        else{
            Serial.println("Invalid input for current state of the chip");
            return;
        }
    }
    
}
/*
void IdleState::printState(){
  Serial.println("GAGAA");
}*/

main.ino

#include "chip.h"
#include "Arduino.h"



chip babelChip;

void setup(){
    Serial.begin(9600);// BAUD HERE
    babelChip = chip();
}

void loop(){
    babelChip.loop();
}

排查建议与修复方案

核心问题定位

Store access fault表明代码尝试写入非法内存地址。结合注释loop函数体仍崩溃的现象,问题大概率出在对象初始化与拷贝的内存管理上。

重点修复点:对象拷贝导致的内存失效

main.ino中先全局声明chip babelChip;(触发默认构造),再在setup中执行babelChip = chip();(触发临时对象构造+赋值操作),这会导致chip类内部的状态对象(idleState/pairedState/genState)被重新拷贝,之前currentState指向的原idleState地址变为无效内存,后续访问时触发崩溃。

修复方案:

  1. 移除重复初始化,直接使用全局声明的对象:

    chip babelChip;
    
    void setup(){
        Serial.begin(9600);
        // 移除 babelChip = chip(); 这一行
    }
    
  2. 或使用动态分配避免对象拷贝:

    chip* babelChip;
    
    void setup(){
        Serial.begin(9600);
        babelChip = new chip();
    }
    
    void loop(){
        babelChip->loop();
    }
    

其他排查方向

  • 检查ledWrite函数的实现,确保没有非法内存访问;
  • 验证D0、D2引脚定义是否与Xiao ESP32C3实际引脚对应,避免引脚配置错误引发硬件异常;
  • 使用ESP-IDF核心转储工具定位具体崩溃行:
    espcoredump.py info_corefile -t esp32c3 your_project.elf core_dump.bin
    

内容的提问来源于stack exchange,提问作者Johan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:25:54