ESP32 Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled?

1 Antwort

Das casten von einen struct pointer auf uint8* ist undefined behaviour keine Ahnung was da der Compiler genau macht, vielleicht kommt da noch ein Padding in die Struct dazu usw. Das ist schlechter Code.

Aber prüf doch mal ob sizeof(lightbar_as) wirklich 300 ist.

Weiters prüfe mal ob counter1 nicht doch irgendwie über 300 geht. Der Fehler kann natürlich auch in den Teilen stecken die nicht gezeigt wurden.


chandler222 
Beitragsersteller
 11.05.2025, 06:37

Habe den "Denk"-Fehler gefunden.
Der Buffer war für eine komplette spalte des Bildes. Übergeben habe ich aber alle Pixel des Bildes (14x14 pixel)
14 x 14 x 3 farben/prixel = 588 > 300

Kelec  11.05.2025, 15:50
@chandler222

Das macht dann Sinn dennoch solltest du so etwas wie den uint8_t* cast vermeiden.

Der Grund ist dass C und C++ keine Angabe darüber machen wie eine Struct genau im Speicher liegt.

So kann der C Kompiler die struct auch als rgbp in den Speicher legen wobei p ein als Padding bezeichnetes Byte ist. Das hat den Hintergrund dass die nächste Strukt im Array auf 32Bit Alligned ist was den Zugriff auf mancher Hardware schneller macht.

Wenn du den Pointer auf die Struct nun im Typ änderst hat der Compiler danach keine Information mehr darüber ob ein Padding vorliegt oder nicht.

Der Cast auf einen anderen Pointer Typ ist nur dann definiert wenn die Daten an irgendeinem Punkt wieder in die Struct geschrieben werden.

Also Byteweises kopieren der Daten zwischen structs des selben Typs ist erlaubt Interpretation oder Manipulation der Daten ist es nicht.

Genau aus diesem Grund ist auch Typepunning oft undefiniert.