Stack-Speicher wieder leer bekommen

Ok, und was kann ich machen, im den Buffer wieder leer zu räumen.

Wenn die Lösung ist, diesen ersr garnicht vollzumüllen, lautet meine Frage:

Wie muss ich get_values umschreiben, dass ich am Ende trotzdem den gesamten struct array auslesen kann?

Es kann ja nichr sein, dass ab dann der Speicher so bleibt, den muss man doch wieder leer bekommen.

Ich dachte ursprünglich eben, das geht mit

Aber das bringt nicht die Lösung

Er beleibt ja nicht voll!
Das ist ja deine Fehlannahme.

Natürlich nicht!
Ist es doch der zweite Tod des Kanarienvogels.
Wenn er vorher noch nicht ganz tot war, ist er es danach ganz sicher.

Der Stack muss einfach groß genug sein, dass dein lokales char buffer[schLen]; rein passt, und du den buffer füllen kannst ohne dass du dabei was anderes zerschießt. Am Ende von getValues ist der Bereich auf dem Stack automatisch wieder frei (und nichts anderes zerschossen).

Hier mal der Sketch.
Ich hab den angepasst, sodass im Loop nur einmal die Funktion "get_values()" ausgeführt wird.

Danach wird bei jedem Durchlauf nur noch der Speicher ausgegeben.

Meine Konsole zeigt:

Freier Speicher vor set_values: 6692
Freier Speicher nach set_values: 6564
Freier Stack-Speicher nach einmal get_values: 116
Freier Stack-Speicher nach einmal get_values: 116
Freier Stack-Speicher nach einmal get_values: 116

D.h. sobald einmal der Buffer gefüllt ist, bleibt der Speicher bei 116.
Das beißt sich mit dem hier:

Warum wächst der dann nicht wieder auf 6692 (oder zumindest etwas höher).

Leudde, ich steh auf dem Schlauch:

grafik

Liegt bestimmt an der Zeitumstellung.

Edit: Oder liegt mein Denkfehler nur wieder darin, dass die Funktion gar nicht das ausgibt, was ich erwarte und in Wirklichkeit der Speicher wieder frei ist? D.h. die Funktion gibt mit nur aus, welchen Speicher ich irgendwann mal belegt hatte?

Edit 2: Das hier hab ich gerade noch gefunden:

evtl. ist das ja ne Möglichkeit, sich den freien Speicher anzeigen zu lassen.

Aber ich bin mir mittlerweile sicher --> genau da liegt mein Denkfehler.
Die Funktion, von der ich immer dachte, dass sie mir den freien Speicher ausgibt, gibt mir nur aus, was die höchste Marke von benutztem Speicher war, die ich bisher erreicht hatte.

Einfach mal Doku ansehen:

uxTaskGetStackHighWaterMark() returns the minimum amount of remaining stack space that was available to the task since the task started executing

Wenn die Hochwassermarke mal auf 116 ist, soll es nie wieder größer werden.

1 Like

Immer noch Verständnisprobleme mit lokalen und globalen Variablen?
Deine testarray, in dass Du mit memcpy schreibst ist eine globale Variable, wenn Du den Code nicht zwischendurch geändert hast.

Gruß Tommy

Yep.
Das war von Anfang an mein Fehler.
Aber zumindest kann ich mir mit der Funktion kurzzeitig ausgeben lassen, wie hoch ich im Loop maximal gekommen bin und meine Stackgröße entsprechend anpassen.

Was aber dennoch interessant wäre: ob ich mir das memcpy sparen kann.

hab ich nicht geändert und ist mir auch klar.
Wie gesagt: Ich dachte die Funktion gibt mir die aktuelle Stackbelegung aus und nicht die höchste bisher erreichte Grenzen.

Das gute ist: Wir bekommen jetzt Besuch und da gibts nur eine Aufgabe:
Kuchen essen und Kaffee trinken --> Da kann man nicht viel falsch verstehen :wink:

Danke Leute. Ich hoffe ihr habt mich trotzdem genauso gern wie ich euch :innocent:

So langsam fällt der Groschen...

Natürlich!
Wenn du prefs.getBytes(). direkt in dein Mamut Array schreiben lässt.
Und dir so das ganze Buffer Gehampel einsparst.

1 Like

testarray liegt aber überhaupt nicht auf dem Stack.

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.