esp32 / arduino code kernel panic

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • witje_
  • Registratie: Maart 2014
  • Laatst online: 07:57
Ik weet niet zeker of ik in het juiste deel van het forum zit...

doel: maken van een library die een deel van de terugkerende code in mijn ESP-projecten verzameld. In het bijzonder het connecteren met wifi en mqtt server en nadien controleren of wifi en mqtt nog verbonden is (en indien niet meer verbonden, opnieuw proberen te verbinden).

Ik heb de code wat geknipt hieronder om de focus te leggen op daar waar het misloopt:
Er wordt gebruikt gemaak van de PubSubclient (Knolleary).

lib.h
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class wifi_mqtt
{
  public:
    wifi_mqtt(String wifiSsid, String wifiPassword, const char* mqttServer);
    void begin();
    bool connect_mqtt();
    bool reconnect();
  
  private:
    WiFiClient espClient;
    PubSubClient mqtt_client;
    String _mqtt_client_id;
};


lib.cpp
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
wifi_mqtt::wifi_mqtt(String wifiSsid, String wifiPassword, const char* mqttServer)
{
    ... 
    PubSubClient mqtt_client(espClient);
    _mqtt_client_id=String(random(0xffff), HEX);
    ...
}
void wifi_mqtt::begin()
{
   connect_wifi();
   connect_mqtt();
}
...
bool wifi_mqtt::connect_mqtt() {
   mqtt_client.setServer(_mqttServer, 1883);
   mqtt_client.setBufferSize(1024);
   if (!mqtt_client.connected()) {
     // Attempt to connect   
     if (mqtt_client.connect(_mqtt_client_id.c_str())) {
        Serial.println("MQTT connected");
     } 
   } 
}


main.cpp
code:
1
2
3
4
5
...
wifi_mqtt wifi_mqtt_client(ssid, passw, mqtt_server);
void setup() {
    wifi_mqtt_client.begin();
}


PubSubclient.cpp (knolleary):
code:
1
2
3
4
5
6
7
boolean PubSubClient::connect(const char *id) {
    return connect(id,NULL,NULL,0,0,0,0,1);
}
boolean PubSubClient::connect(const char *id, const char *user, const char *pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage, boolean cleanSession) {
    if (!connected()) {
        int result = 0;
}


De code compileert correct maar op de ESP krijg ik telkens een kernel panic die terug te leiden is naar
lib.cpplijn_19if (mqtt_client.connect(_mqtt_client_id.c_str())) {
PubSubclient.cpplijn_5if (!connected()) {



foutmelding:
code:
1
2
3
4
5
6
7
8
9
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core  1 register dump:
PC      : 0x400d2b49  PS      : 0x00060130  A0      : 0x800d2d6d  A1      : 0x3ffb21b0  
A2      : 0x3ffc4034  A3      : 0x3ffc3ff4  A4      : 0x00000000  A5      : 0x00000000  
A6      : 0x00000000  A7      : 0x00000000  A8      : 0x800d2b42  A9      : 0x3ffb2190  
A10     : 0x00000000  A11     : 0x3f404d59  A12     : 0x22f696ad  A13     : 0x3ffc4404  
A14     : 0x00ff0000  A15     : 0xff000000  SAR     : 0x00000020  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x40089911  LEND    : 0x40089921  LCOUNT  : 0xfffffffd


EXCVADDR: --> 0; dus dit lijkt een er ergens een pointer naar foute plaats verwijst, alsof bij het uitvoeren van de functie "connected()", het programma de weg kwijt is?

Mijn vraag:
hebben jullie een idee wat ik verkeerd doe?

Relevante software en hardware die ik gebruik
platformio
PubSubClient van Knolleary

Beste antwoord (via witje_ op 21-08-2023 07:57)


  • Hans1990
  • Registratie: Maart 2004
  • Niet online
Regel 4 van lib.cpp maak je PubSubClient aan, maar door het type ervoor te hebben is dat een local variable. Wil je dat, of moet die in het object komen? Het kan zijn dat mqtt_client nu niet goed geinitaliseerd is.

Als je de constructor van een object opnieuw wilt aanroepen, kan je foo = { args }; gebruiken.

Voorbeeld: https://godbolt.org/z/sh77qfba7

Comment regel 23 maar eens, en je zal zien welk verschil ik bedoel.

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Hans1990
  • Registratie: Maart 2004
  • Niet online
Regel 4 van lib.cpp maak je PubSubClient aan, maar door het type ervoor te hebben is dat een local variable. Wil je dat, of moet die in het object komen? Het kan zijn dat mqtt_client nu niet goed geinitaliseerd is.

Als je de constructor van een object opnieuw wilt aanroepen, kan je foo = { args }; gebruiken.

Voorbeeld: https://godbolt.org/z/sh77qfba7

Comment regel 23 maar eens, en je zal zien welk verschil ik bedoel.

Acties:
  • 0 Henk 'm!

  • witje_
  • Registratie: Maart 2014
  • Laatst online: 07:57
Bedankt,

dat was de oplossing. Ik heb regel 4 van lib.cpp vervangen door
code:
1
mqtt_client={espClient};

en het probleem is weg.

Ik krijg nu wel tijdens het opstarten een paar keer volgende foutmelding (met reboots). De foutmelding komt bij lib.cpp lijn 19
code:
1
2
assert failed: vTaskGenericNotifyGiveFromISR tasks.c:5845 (( ( &( pxTCB->xEventListItem ) )->pvContainer ) == ((void *)0))
Backtrace: 0x4008365d:0x3ffbeaec |<-CORRUPTED

Na een paar keer echter geen melding en loopt het programma verder zonder problemen.