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

ESP32搭配TCA9548A与MPU6050的内存错误问题求助

问题描述

我正在开发一个项目,使用4个MPU6050加速度计通过TCA9548A多路复用器连接ESP32。传感器采样数据正确,但每次采样后会出现“ESP32: Guru Meditation Error: Core 1 panic'ed (StoreProhibited)”错误。更新ESP32核心后,编译运行出现堆损坏错误。以下是项目代码、串口输出及栈解码结果,请求指导修改代码解决问题。

项目代码

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;
Adafruit_MPU6050 mpu3;
Adafruit_MPU6050 mpu4;
unsigned long _time;

void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A address
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
}

void printValues(Adafruit_MPU6050 mpu, int bus) {
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);
  TCA9548A (bus);
  Serial.print("Sensor: ");
  Serial.println(bus);
  Serial.print("Eixo X:");
  Serial.print(a.acceleration.x);
  Serial.print(" m/s^2, ");
  Serial.print("\tEixo Y:");
  Serial.print(a.acceleration.y);
  Serial.print(" m/s^2, ");
  Serial.print("\tEixo Z:");
  Serial.print(a.acceleration.z);
  Serial.print(" m/s^2,");
  Serial.print("\t Temperatura: ");
  Serial.print(temp.temperature);
  Serial.println(" °C");
}

void setup(void) {
  Serial.begin(115200);
  Wire.begin();

  TCA9548A(2);
  if (!mpu1.begin(0x68)) {
    Serial.println("Could not find a valid BME280 sensor on bus 2, check wiring!");
    while (1);
  }
  Serial.println();
  
  // Init sensor on bus number 3
  TCA9548A(3);
  if (!mpu2.begin(0x68)) {
    Serial.println("Could not find a valid BME280 sensor on bus 3, check wiring!");
    while (1);
  }
  Serial.println();
  
  // Init sensor on bus number 4
  TCA9548A(4);
  if (!mpu3.begin(0x68)) {
    Serial.println("Could not find a valid BME280 sensor on bus 4, check wiring!");
    while (1);
  }
  Serial.println();
  
  // Init sensor on bus number 5
  TCA9548A(5);
  if (!mpu4.begin(0x68)) {
    Serial.println("Could not find a valid BME280 sensor on bus 5, check wiring!");
    while (1);
  }
  Serial.println();
}

void loop() {
  printValues(mpu1, 2);
  printValues(mpu2, 3);
  printValues(mpu3, 4);
  printValues(mpu4, 5);
  yield();
  delay(100);
  }

串口监视器输出

Sensor: 2
Eixo X:-0.72 m/s^2, Eixo Y:-0.03 m/s^2,     Eixo Z:9.71 m/s^2,   Temperatura: 26.84 °C
Sensor: 3
Eixo X:0.36 m/s^2,  Eixo Y:-0.27 m/s^2,     Eixo Z:8.31 m/s^2,   Temperatura: 24.62 °C
Sensor: 4
Eixo X:0.16 m/s^2,  Eixo Y:-0.19 m/s^2,     Eixo Z:9.86 m/s^2,   Temperatura: 27.26 °C
Sensor: 5
Eixo X:0.71 m/s^2,  Eixo Y:0.10 m/s^2,  Eixo Z:9.82 m/s^2,   Temperatura: 27.02 °C
Guru Meditation Error: Core  1 panic'ed (StoreProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x400ebac0  PS      : 0x00060130  A0      : 0x800d19a2  A1      : 0x3ffb1db0  
A2      : 0x00010001  A3      : 0x000000ae  A4      : 0x00060023  A5      : 0x3ffb8058  
A6      : 0x00000000  A7      : 0x00000000  A8      : 0x00010101  A9      : 0x00000001  
A10     : 0x3ffc02ac  A11     : 0x3ffc0110  A12     : 0x00000020  A13     : 0x80000020  
A14     : 0x00000008  A15     : 0x00000001  SAR     : 0x0000000a  EXCCAUSE: 0x0000001d  
EXCVADDR: 0x00010127  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xffffffff  

ELF file SHA256: 0000000000000000

Backtrace: 0x400ebac0:0x3ffb1db0 0x400d199f:0x3ffb1dd0 0x400d1a6a:0x3ffb1df0 0x400d1819:0x3ffb1e10 0x400d1492:0x3ffb1e40 0x400d16e2:0x3ffb1e90 0x400d0e99:0x3ffb1eb0 0x400d0f5e:0x3ffb1f40 0x400d3999:0x3ffb1fb0 0x400869bd:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:5856
entry 0x400806a8

更新ESP32核心后的运行错误

CORRUPT HEAP: Bad head at 0x3ffb94ec. Expected 0xabba1234 got 0x3ffb8014

assert failed: multi_heap_free multi_heap_poisoning.c:253 (head != NULL)


Backtrace:0x400837b9:0x3ffb25800x40088135:0x3ffb25a0 0x4008d001:0x3ffb25c0 0x4008cc67:0x3ffb26f0 0x40083ae9:0x3ffb2710 0x4008d031:0x3ffb2730 0x400e1d41:0x3ffb2750 0x400d1591:0x3ffb2770 0x400d1697:0x3ffb2790 0x400d143e:0x3ffb27b0 0x400d3e19:0x3ffb2820 




ELF file SHA256: 0000000000000000

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13160
load:0x40080400,len:3036
entry 0x400805e4

栈解码结果

Decoding stack results
0x400837b9: panic_abort at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_system/panic.c line 402
0x40088135: esp_system_abort at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_system/esp_system.c line 128
0x4008d001: __assert_func at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/newlib/assert.c line 85
0x4008cc67: multi_heap_free at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/multi_heap_poisoning.c line 245
0x40083ae9: heap_caps_free at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_caps.c line 340
0x4008d031: free at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/newlib/heap.c line 39
0x400e1d41: operator delete(void*) at /builds/idf/crosstool-NG/.build/HOST-i686-w64-mingw32/xtensa-esp32-elf/src/gcc/libstdc++-v3/libsupc++/del_op.cc line 49
0x400d1591: Adafruit_MPU6050_Temp::~Adafruit_MPU6050_Temp() at C:\Users\thiag\Documents\Arduino\libraries\Adafruit_Sensor-master/Adafruit_Sensor.h line 165
0x400d1697: Adafruit_MPU6050::~Adafruit_MPU6050() at C:\Users\thiag\Documents\Arduino\libraries\Adafruit_MPU6050\Adafruit_MPU6050.cpp line 50
0x400d143e: loop() at C:\Users\thiag\Desktop\Trabalho/Trabalho.ino line 74
0x400d3e19: loopTask(void*) at C:\Users\thiag\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.5\cores\esp32\main.cpp line 50
解决方案

问题根源

从栈解码结果可以看出,错误发生在Adafruit_MPU6050对象的析构函数中,原因是printValues函数采用值传递的方式传入Adafruit_MPU6050对象。每次调用该函数时,会创建一个原对象的副本,函数执行完毕后副本被销毁,析构过程中会尝试释放原对象持有的资源,导致堆内存损坏或非法内存访问。

另外代码中还有两个小问题:

  • 初始化传感器时的提示信息错误,把MPU6050写成了BME280
  • printValues中调用mpu.getEvent之前没有切换到对应多路复用器总线,虽然能获取数据,但逻辑顺序错误

修改后的代码

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;
Adafruit_MPU6050 mpu3;
Adafruit_MPU6050 mpu4;
unsigned long _time;

void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A地址
  Wire.write(1 << bus);          // 发送选择总线的字节
  Wire.endTransmission();
}

// 使用引用传递对象,避免创建副本
void printValues(Adafruit_MPU6050 &mpu, int bus) {
  TCA9548A(bus);  // 先切换到对应总线
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);
  
  Serial.print("传感器: ");
  Serial.println(bus);
  Serial.print("X轴:");
  Serial.print(a.acceleration.x);
  Serial.print(" m/s², ");
  Serial.print("\tY轴:");
  Serial.print(a.acceleration.y);
  Serial.print(" m/s², ");
  Serial.print("\tZ轴:");
  Serial.print(a.acceleration.z);
  Serial.print(" m/s²,");
  Serial.print("\t 温度: ");
  Serial.print(temp.temperature);
  Serial.println(" °C");
}

void setup(void) {
  Serial.begin(115200);
  Wire.begin();

  TCA9548A(2);
  if (!mpu1.begin(0x68)) {
    Serial.println("总线2上未找到有效MPU6050传感器,请检查接线!");
    while (1);
  }
  Serial.println();
  
  // 初始化总线3上的传感器
  TCA9548A(3);
  if (!mpu2.begin(0x68)) {
    Serial.println("总线3上未找到有效MPU6050传感器,请检查接线!");
    while (1);
  }
  Serial.println();
  
  // 初始化总线4上的传感器
  TCA9548A(4);
  if (!mpu3.begin(0x68)) {
    Serial.println("总线4上未找到有效MPU6050传感器,请检查接线!");
    while (1);
  }
  Serial.println();
  
  // 初始化总线5上的传感器
  TCA9548A(5);
  if (!mpu4.begin(0x68)) {
    Serial.println("总线5上未找到有效MPU6050传感器,请检查接线!");
    while (1);
  }
  Serial.println();
}

void loop() {
  printValues(mpu1, 2);
  printValues(mpu2, 3);
  printValues(mpu3, 4);
  printValues(mpu4, 5);
  yield();
  delay(100);
}

关键修改点

  1. 修改参数传递方式:将printValues函数的参数Adafruit_MPU6050 mpu改为`Adafruit_MPU6050 &mpu
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:25:20