Hi zusammen,
sorry, dass ich euch heute so mit Fragen / Posts bombadiere.
Aber ich hab wieder mal ne Grundwissen-Frage ... ... ich weiß...eigentlich ist das hier nicht der richtige Ort für solche Fragen, aber ich trau mich trotzdem wieder mal, euch zu nerven und freue mich, wenn sich jemand erbarmt
Wie bekomm ich denn den Stack-Speicher (z.B. des Loop-Tasks) wieder leer, wenn ich den mal zugemüllt habe.
Folgender Beispiel-Code (völlig sinnfrei, nur zur Veranschaulichung):
#include <Preferences.h>
Preferences prefs;
typedef struct {
double wert_eins;
double wert_zwei;
} test;
test testarray[400]; // Übertrieben großer Array
double wert_eins=0;
double wert_zwei=0;
void setup() {
Serial.begin(115200);
prefs.begin("settings", false);
prefs.clear();
prefs.end();
}
void loop() {
set_values(2021, 2.44, 12.44); // Irgendwas reinfüllen
get_values(2021); // Und irgendwas abrufen --> Schwups, ist der Speicher voll
Serial.printf("\nFreier Stack-Speicher: %d", uxTaskGetStackHighWaterMark(NULL));
Serial.println();
Serial.print("Wert eins:");Serial.println(wert_eins);
Serial.print("Wert zwei:");Serial.println(wert_zwei);
memset(testarray, 0, sizeof(testarray));// Versuch zwei, den Stack wieder zu leeren
Serial.printf("\nFreier Stack-Speicher: %d", uxTaskGetStackHighWaterMark(NULL));
delay(5000);
}
void get_values(uint16_t jahr) {
// Werte ausgeben
prefs.begin("settings", false);
size_t schLen = prefs.getBytes("values_set", NULL, 0);
char buffer[schLen];
prefs.getBytes("values_set", buffer, schLen);
memcpy(testarray, buffer, schLen);
wert_eins=testarray[jahr-2021].wert_eins;
wert_zwei=testarray[jahr-2021].wert_zwei;
memset(buffer, 0, sizeof(buffer)); // Versuch eins, den Stack wieder zu leeren
prefs.end();
}
void set_values(uint16_t jahr, double wert_eins, double wert_zwei) {
// Werte speichern
prefs.begin("settings", false);
testarray[jahr-2021].wert_eins=wert_eins;
testarray[jahr-2021].wert_zwei=wert_zwei;
prefs.putBytes("values_set", &testarray, sizeof(testarray));
prefs.end();
}
mit
memcpy(testarray, buffer, schLen);
pack ich ja quasi den (hier völlig überdimensionierten Array) in einen Char Buffer.
Ab dann ist der Stack quasi voll.
Wie bekommt man den denn dann wieder leer.
Ich dachte mit
memset(buffer, 0, sizeof(buffer));
würde ich den Buffer wieder leer machen und somit Stack-Speicher zurückgewinnen - hat aber natürlich nicht funktioniert ;-(
Daher die Frage:
Wie bekomme ich den Array wieder aus dem Stack "raus"?
Könnte ja sein, ich will nur ein paar Werte aus dem Array in lokale Variablen laden (wie ich es hier in dem Beispiel mache) und dann den Array-Inhalt wieder raus haben wollen (denn der ist ja in den Prefs gespeichert und liegt da griffbereit)
Danke für eure Hilfe