heute ist mein Glückstag:
Ich hab ENDLICH den Bug gefunden, warum bei mir nach einer Weile immer der Webserver meines ESP32 nicht mehr erreichbar ist...denn an der Stelle hatte ich den Fehler einfach nicht vermutet:
Ich nutze bei meinem Projekt den SD-Kartenleser.
Irgendwann hatte ich mir mal eingebildet, ich muss im Loop immer prüfen, ob die SD-Karte noch eingesetzt bzw. lesbar ist, um sofort einen Fehlermeldung zu erhalten.
Also hab ich im Loop immer ein SD.begin() ausgeführt.
Durch überwachen des Speichers und systematisches Code-Reduzieren hab ich nun bemerkt, dass es innerhalb weniger Stunden den Speichern komplett leersaugt (bzw. vollstopft, wäre wohl eher richtig) - und die Ursache war das SD.begin()
Hier mal ein Sketch, mit dem ihr das evtl. mal nachvollziehen könnt:
#include <SD.h> // SD-Kartenleser
unsigned long millisMerker= 0;
unsigned long dauerBisRepeat = 20000;
int sd_card_status =0;
void setup() {
Serial.begin(115200);
if (!SD.begin(5)) {
sd_card_status=0;
} else {
sd_card_status=1;
}
}
void loop() {
if (!SD.begin(5)) {
sd_card_status=0;
} else {
sd_card_status=1;
}
if (millis() - millisMerker > dauerBisRepeat) {
uint32_t heapSize=ESP.getHeapSize(); //total heap size
uint32_t freeHeap=ESP.getFreeHeap(); //available heap
uint32_t minFreeHeap=ESP.getMinFreeHeap(); //lowest level of free heap since boot
uint32_t maxAllocHeap=ESP.getMaxAllocHeap(); //largest block of heap that can be allocated at once
Serial.println(" -> Total: " + (String)heapSize + ", Frei: " + (String)freeHeap + " Min: "+ (String)minFreeHeap + ", Max: " + (String)maxAllocHeap) + " SD-Card:" + sd_card_status;
millisMerker = millis();
}
}
Das fiese ist: Das Problem besteht nur, wenn keine SD-Karte eingesetzt ist.
Wenn eine drin ist, bleibt der Speicherzustand stabil.
Nun ist die erste Frage: ist es ein Bug oder ein Feature
Weitere, ernst gemeinte, Fragen:
Gibt es eine smartere Möglichkeit, zur Laufzeit dauerhaft zu überwachen, ob eine SD-Karte noch eingesetzt ist OHNE dass es meinen Speicher leersaugt?
Oder ist das dauerhafte Überwachen ansich einfach nur dumm und es reicht, wenn ich das einmal im Setup mache und fertig?
Gibt es programmiertechnisch evtl. sogar eine Lösung, wie man nach einem SD-begin() den Speicherplatz wieder frei bekommt (sorry, wenn ich immer "Speicherplatz" schreibe, sicherlich gibt es hier eine fachmännisch korrekter Lösung...)?
Überhaupt ist doch die Frage, warum das passiert, wenn keine SD-Karte eingesetzt ist.
Es gibt Hinweise auf einen Card Detect Anschluss und eine Softwarelösung zum wiederholten Aufruf von SD.begin(), den letzten Post lesen!
Außerdem gibt es natürlich auch Funktionen, um Karteninformationen zu lesen. Dazu gerne einmal das Beispiel CardInfo.ino anschauen. Vielleicht lässt sich daraus etwas zusammenstellen.
Wird nicht unterstützt im SPI Modus für Arduino
vertauscht mit Karten Pin.
Hier Beschreibung für CD Pin
"Es gibt einen weiteren Pin CD - das ist der Card Detect Pin. Er schließt sich mit Masse kurz, wenn eine Karte nicht eingesteckt ist. (Beachten Sie, dass bei einigen Kartenhaltern die Reihenfolge umgekehrt ist). Sie sollten einen Pull-Up-Widerstand (10K oder so) anschließen und diesen mit einem anderen Pin verbinden, wenn Sie erkennen wollen wenn eine Karte eingesteckt ist. Wir werden ihn vorerst nicht verwenden."
Moin @my_xy_projekt , schön mal wieder von Dir zu hören!
Ich habe mir den Kram aus dem von mir gefundenen Link von 2011 noch mal angeschaut; der dortige Vorschlag ( root.close() ) ist in der aktuellen Arduino SD-Lib bereits umgesetzt ...
Damit dürfte das aktuelle Problem damit wohl nicht zu umgehen sein.
Bleibt der Card Detect Pin oder eine softwareseitige Prüfung, die nicht von irgendwelchen Puffern irregeführt wird ... ?!?
Software mäßig ist die Prüfung ob Karte eingelegt nicht das Problem, nur wen die Karte aus irgend einem gründe sein Geist aufgibt kommt zurück das Problem mit vollem Speicher oder Hänger im System.
Schalter ist gut nur zum Test Karte da oder nicht.