fix(P4): Endlose Neustartschleife nach Kaltstart (1.9.11)
Log zeigt zweimal hintereinander "rst:0x1 (POWERON)" und "[Panel] Startgrund: 1", danach nichts mehr - Beleuchtung an, kein Bild. Ursache: Der gewollte einmalige Neustart nach Kaltstart (WS7_COLD_BOOT_RESTART) prüfte nur esp_reset_reason() == ESP_RST_POWERON. Der Kommentar nahm an, der zweite Durchlauf melde einen Software-Reset. Tatsächlich meldet der Chip auch nach esp_restart() wieder POWERON, die Bedingung greift erneut - Endlosschleife. Der bootguard konnte nicht eingreifen, weil derselbe Zweig "early" jedes Mal auf 0 zurücksetzt. - Zusätzliches NVS-Flag "kaltneu" in bootguard: wird vor esp_restart() gesetzt und beim zweiten Durchlauf erkannt und gelöscht. Unabhängig vom gemeldeten Startgrund, damit die Schleife strukturell ausgeschlossen ist. - Die Meldung lief über DBG_SERIAL (USB-CDC) und war im Monitor an der UART nicht zu sehen - jetzt esp_rom_printf wie die übrigen Panel-Meldungen. Beide Panel-Varianten mit arduino-cli gegengebaut. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NeFMr439WcLMdebE3kU7fS
This commit is contained in:
co-authored by
Claude Opus 5
parent
7d7893cf08
commit
5df6c20171
@@ -1,3 +1,16 @@
|
||||
Version 1.9.11:
|
||||
- Endlose Startschleife behoben: Beleuchtung an, nie ein Bild. Der P4 startet sich nach dem
|
||||
Einschalten absichtlich einmal neu, weil das Panel sonst schwarz bleibt. Die Absicherung
|
||||
dagegen verließ sich darauf, dass der zweite Start kein Kaltstart mehr ist - der Chip
|
||||
meldet aber auch nach dem selbst ausgelösten Neustart wieder einen Kaltstart. Damit griff
|
||||
die Bedingung erneut, endlos.
|
||||
- Der Neustart wird jetzt vermerkt und beim zweiten Durchlauf erkannt, unabhängig davon, was
|
||||
der Chip als Startgrund meldet. Beim nächsten echten Einschalten erfolgt wieder genau ein
|
||||
Neustart.
|
||||
- Die Meldung über diesen Neustart lief bisher über die USB-Verbindung und war im seriellen
|
||||
Monitor nicht zu sehen - deshalb war von der Schleife nichts zu erkennen. Sie läuft jetzt
|
||||
denselben Weg wie die übrigen Panel-Meldungen.
|
||||
|
||||
Version 1.9.10:
|
||||
- Alle Messzeilen laufen jetzt auf derselben Uhr. Die des Zeichenablaufs startete später als
|
||||
die des Hauptablaufs; die Zeiten ließen sich nur mit Umrechnung vergleichen.
|
||||
|
||||
@@ -336,19 +336,36 @@ void setup() {
|
||||
// nicht (siehe WS7_DSI_RESTART).
|
||||
//
|
||||
// Deshalb startet der P4 sich nach einem Kaltstart genau einmal selbst neu, nachdem
|
||||
// der erste Hochlauf durch ist. Beim zweiten Durchlauf ist der Startgrund kein
|
||||
// Kaltstart mehr, die Bedingung greift also nicht erneut - eine Schleife ist
|
||||
// ausgeschlossen. Kostet rund drei Sekunden, aber nur beim Einschalten.
|
||||
// der erste Hochlauf durch ist. Kostet rund drei Sekunden, aber nur beim Einschalten.
|
||||
//
|
||||
// Frueher stuetzte sich die Absicherung dagegen allein auf den Startgrund: Beim zweiten
|
||||
// Durchlauf sei es kein Kaltstart mehr, eine Schleife also ausgeschlossen. Das stimmt
|
||||
// nicht - der Chip meldet auch nach dem selbst ausgeloesten Neustart wieder einen
|
||||
// Kaltstart, und dann startet er endlos neu. Genau das ist aufgetreten: Beleuchtung an,
|
||||
// nie ein Bild. Deshalb wird jetzt zusaetzlich vermerkt, dass der Neustart schon
|
||||
// stattgefunden hat; darauf ist Verlass, unabhaengig vom gemeldeten Startgrund.
|
||||
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_COLD_BOOT_RESTART
|
||||
if (esp_reset_reason() == ESP_RST_POWERON) {
|
||||
// Der Fruehstart-Zaehler wurde oben bereits erhoeht. Diesen gewollten Neustart
|
||||
// darf er nicht mitzaehlen, sonst laeuft die Absturzsicherung nach ein paar
|
||||
// Einschaltvorgaengen in den Update-Modus.
|
||||
{ Preferences p; p.begin("bootguard", false); p.putUShort("early", 0); p.end(); }
|
||||
DBG_SERIAL.println(F("[Panel] Kaltstart - einmaliger Neustart fuer das Displaypanel"));
|
||||
DBG_SERIAL.flush();
|
||||
delay(50);
|
||||
esp_restart();
|
||||
Preferences p;
|
||||
p.begin("bootguard", false);
|
||||
bool schonNeugestartet = p.getUChar("kaltneu", 0) != 0;
|
||||
if (schonNeugestartet) {
|
||||
// Zweiter Durchlauf: Vermerk loeschen, damit beim naechsten echten Einschalten
|
||||
// wieder genau ein Neustart erfolgt.
|
||||
p.putUChar("kaltneu", 0);
|
||||
p.end();
|
||||
esp_rom_printf("[Panel] Neustart bereits erfolgt - Hochlauf wird fortgesetzt\n");
|
||||
} else {
|
||||
p.putUChar("kaltneu", 1);
|
||||
// Der Fruehstart-Zaehler wurde oben bereits erhoeht. Diesen gewollten Neustart
|
||||
// darf er nicht mitzaehlen, sonst laeuft die Absturzsicherung nach ein paar
|
||||
// Einschaltvorgaengen in den Update-Modus.
|
||||
p.putUShort("early", 0);
|
||||
p.end();
|
||||
esp_rom_printf("[Panel] Kaltstart - einmaliger Neustart fuer das Displaypanel\n");
|
||||
delay(50);
|
||||
esp_restart();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
g_client.begin(); // UART starten, hello folgt automatisch in loop()
|
||||
|
||||
Reference in New Issue
Block a user