如何修复 Guru Meditation 错误:Core 1 恐慌(LoadProhibited)错误

问题描述 投票:0回答:4

我正在尝试为 ESP32 芯片编写代码,它从 DHT22 传感器获取读数,将其打包成 json 文件,然后将其发送到 Flask 服务器。一切工作正常,直到我尝试发布,我收到以下错误:

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x400d3488  PS      : 0x00060030  A0      : 0x800d355c  A1      : 0x3ffb1bb0  
A2      : 0x00000000  A3      : 0x3ffb1bff  A4      : 0x00000001  A5      : 0x00000001  
A6      : 0x00000000  A7      : 0x00000000  A8      : 0x00000000  A9      : 0x00000000  
A10     : 0x00000000  A11     : 0x3ffcb8fc  A12     : 0x00000050  A13     : 0x00000001  
A14     : 0x00000000  A15     : 0x00000000  SAR     : 0x0000000a  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000008  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0xffffffff

我对此问题进行了详尽的搜索,但无济于事,我不知道发生了什么。有人能提供有关如何解决此问题的见解吗?

这是我的 Arduino 代码:

#include <HTTPClient.h>
#include <WiFi.h>
#include <DHT.h>
#include <ArduinoJson.h>

#define DHTTYPE DHT22

const char* ssid = "ssid";
const char* password = "password";

uint8_t sensor = 16;
DHT dht(sensor, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.begin(ssid, password);

  while(WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting...");
  }
  Serial.println("Connected!");
}

void loop() {
  if(WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("http://192.168.10.5:8090/");
    http.addHeader("Content-Type", "text/plain");
    Serial.println("Began http on Flask");

    const int cap = JSON_OBJECT_SIZE(2);
    StaticJsonDocument<cap> doc;
    Serial.println("Created json document");

    doc["temperature"] = dht.readTemperature();
    doc["humidity"] = dht.readHumidity();
    Serial.println("Read temperature and humidity correctly");

    char output[256];
    serializeJsonPretty(doc, output);
    Serial.println(output);
    
    //Code will give back error after trying to POST
    int httpCode = http.POST(output);
    Serial.println("Got httpCode");
    if(httpCode > 0) {
      Serial.println(httpCode);
    } else Serial.println("Error in Connection");
    http.end();
  }
  delay(10000);
}

这里有 print 语句,它们会根据进入代码的程度打印出各种内容。它可以很好地打印出 json 文档,但不会打印出“Got httpCode”。下面是我的 Flask 服务器代码:

from flask import Flask, request
app = Flask(__name__)

@app.route('/', methods = ['POST'])
def hello():
    req = request.get_json()
    print(req)
    return "Thanks", 200

if __name__ == "__main__":
    app.run(host = '0.0.0.0', port = 8090)

提前感谢您的帮助。

flask arduino-ide esp32
4个回答
3
投票

我在使用WebSockets时也遇到了这个错误。

事实证明,我用于接收消息的缓冲区(全局声明)是追加新消息,而不是覆盖其中预先存在的内容。因此,进行了非法内存写入尝试,设备出现恐慌并重新启动。

解决方案: 我只是在 onWebSocketEvent() 函数内部本地声明了缓冲区,并且覆盖问题得到了解决,因为在每个事件上都重新声明了缓冲区,以防止非法内存写入尝试。该设备再也没有出现过恐慌。


1
投票

我在回调过程中遇到了 Guru 错误,原因是微内存不足。解决方案是摆脱未使用的库并使用指针而不是创建局部变量。


1
投票

我最近在进行原型设计的 ESP32 库上遇到了类似的错误(请参阅此处 https://github.com/aeonSolutions/aeonlabs-ESP32-C-Base-Firmware-Libraries#readme)我初始化测量类。

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core  1 register dump:
PC      : 0x4200a746  PS      : 0x00060b30  A0      : 0x820052d9  A1      : 0x3fcebb40  
A2      : 0x00000000  A3      : 0x3fcf30a8  A4      : 0x3fcf75c4  A5      : 0x3fcf6888  
A6      : 0x3fcf655c  A7      : 0x3c13ea43  A8      : 0x8200a746  A9      : 0x3fcebb20  
A10     : 0x00000006  A11     : 0x00000004  A12     : 0x00000078  A13     : 0x0000002c  
A14     : 0x0000002b  A15     : 0x0000e100  SAR     : 0x0000000c  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x400556d5  LEND    : 0x400556e5  LCOUNT  : 0xfffffffe  


Backtrace: 0x4200a743:0x3fcebb40 0x420052d6:0x3fcebc00 0x42030726:0x3fcebc90

EXCVADDR: 0x00000008

中的
通常表示空指针类型的错误。检查代码中是否有未初始化的变量。

在我的这个特殊情况下,MEASUREMENTS_CLASS 未初始化,尽管调用成员函数/方法仍然有效,但带有变量赋值的第一行代码会导致代码崩溃并出现上述错误。为了解决这个问题,我只需要从以下位置正确初始化类:

#include "measurements.h"
MEASUREMENTS_CLASS* measurements;

#include "measurements.h"
MEASUREMENTS_CLASS* measurements = new MEASUREMENTS_CLASS();

0
投票

当您访问索引或任何超出范围的内容时,您基本上会收到 LoadProhibited 错误。在访问它们之前检查初始化和定义是否正确。

© www.soinside.com 2019 - 2024. All rights reserved.