Hallo,
wieder mal ein Problem, um Strings zu vermeiden.
Ich lese auf einem ESP32 aus dem Eeprom 2 byte. Dort sind Zahlen als Text gespeichert. Das ist zwar Speicherverschwendung, geht aber momentan (noch) nicht anders.
Diese sollen zu einer Zahl verknüpft werden.
Wie komme ich zum Ziel?
uint8_t EepromReadInt8(uint16_t StartAddress, uint8_t defaultValue = 0) {
char lowByte = (char)EEPROM.read(StartAddress);
char highByte = (char)EEPROM.read(StartAddress + 1);
Serial.print("lowByte: ");
Serial.println(lowByte); // = 2
Serial.print("highByte: ");
Serial.println(highByte); // = 5
uint8_t result = 0;
.
.
return result; // soll in diesem Fall 25 zurück geben
}
Der Ansatz mit weniger Strings ist schon mal sau geil
Der Sketch verwendet 955002 Bytes (72%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.
Globale Variablen verwenden 42640 Bytes (13%) des dynamischen Speichers, 285040 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.
Vorher waren es 971966 Bytes verwendeter Programmspeicherplatz.
Der Platz für lokale Variablen hat sich auch um ein paar 100 Bytes vergrößert.
Mal abwarten, wann der wdt meckert und einen Reboot auslöst, weil kein genügend großer Block mehr im RAM verfügbar ist. Das passierte bisher so alle 3-4 Tage.
Wenn man den 'Block' einfach da lässt, wo Er - zumindest zum Anfang - Seinen Platz gefunden hat und nur leert?
Dann muß auch kein neuer Platz gesucht werden, wo das Trumm an String hin muß (oder Array oder was weiß ich denn).
Also static oder global wäre mein Vorgehen.
@freddy64: Grundsätzlich kommt man ohne die Klasse String aus.
Wenn es dann doch sein muss, solltest Du Dir mal die Methode String.reserve(länge) anschauen.
Mit der kannst Du im Setup den Speicher für die maximallänge reservieren, da wird weniger fragmentiert.
Der Asynchrone Webserver arbeitet viel mit Strings.
Jetzt habe ich aber gesehen, dass die Klasse AsyncWebServerRequest 2 Funktionen hat:
const String& arg(const String& name) const; // get request argument value by name
const String& arg(const __FlashStringHelper * data) const; // get request argument value by F(name)
Also alle requests von request->arg("value") in request->arg(F("value")) geändert.
Evtl hilft das schon etwas weiter.
Die Strings der AsyncWebServerResponses verändern ständig ihre Größe, da viele AJAX-Anfragen rein kommen und die Antworten des Servers dann immer unterschiedlich ausfallen (Sensorwerte, Relay-Zustände, Uhrzeit....).
Mal abwarten, wie sich die Sache jetzt verhält.
ESP.getFreeHeap() zeigt immer über 228000 bytes an. Trotzdem startet der ESP aus bisher noch unbekannten Gründen alle paar Tage neu. Das ist zwar nicht so tragisch, da die Konfiguration im Eeprom gespeichert ist und der Server sofort nach dem Neustart alle vorherigen Zustände wieder herstellt.