Char string Speicher freigeben

Hallo Zusammen

Ich habe mal eine Frage

kann man den Speicher von Char-Strings wieder freigeben
folgendes Beispiel nach dem Serialsenden moechte
Ich den Speicher wieder freigeben in diesen Beispiel
belegen die Strings 500 Byte an Ram obwohl
450 nicht mehr gebraucht werden

Gruss juergen

char zeile1[51];





void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

   snprintf(zeile1,50,("%s"),"digitalRead(solarpumperelaypin)");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),",digitalRead(Brunnenpumpeeinpin)); ");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),"Markiere Seiten mit , um mehr");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),"News Feed zu sehen, die dich interessieren.");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),"digitalRead(solarpumperelaypin)");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),"esendet. Falls du diese E-Mails in Zukunft ");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),"Markiere Seiten mit , um mehr");
   Serial.println(zeile1);
   snprintf(zeile1,50,("%s"),"leite diese E-Mail zum Schutz deines Kontos");
   Serial.println(zeile1);
}

belegen die Strings 500 Byte an Ram obwohl

Das hat doch nichts mir char Arrays zu tun. Dafür brauchst du maximal 51 Bytes

Wo du völlig unnötig RAM verschwendest ist bei den String-Literalen. Verwende das PSTR() Makro um die Literale im Flash zu lassen und dann %S statt %s.

Oder verzichte gleich auf printf(). Das braucht man hier gar nicht:

Serial.println(F("digitalRead(solarpumperelaypin)"));

Auch hier sorgt F() dafür dass kein RAM belegt wird

Edit:

Sorry, Frage nicht verstanden.

Hallo combie

Das ist nur ein Beispieltext Ich wollte
nur Fragen ob man bei Char strings den Speicher
wieder feigeben kann

Ich danke Dir

Gruss juergen

Dir sollte aber generell schon klar sein dass String-Literale normal immer RAM belegen. Durch die Prozessor-Architektur können die meisten Assembler-Befehle nur mit Daten im RAM umgehen. Also wird einfach alles ins RAM kopiert.

Um das zu umgehen gibt es Makros wie PROGMEM, PSTR() und F() (letzeres aus der Arduino Software) um mit Strings um Flash umzugehen. Bei printf() gibt es %S. Und von den Standard Speicher- und String-Funktionen gibt es _P Versionen für Daten im Flash (welche zusammen mit PSTR() verwendet werden).

Auch wenn du den Puffer lokal hast müllst du dir immer noch den Speicher mit den Konstanten zu

Freigeben hat wenig Sinn da der Arduino keine Gabage Collektion hat (Der Speicher ist Fleckenweise besetzt aber er wird nicht aufgeräumt um den freigegebenen Speicher zusammenzufassen).

Grüße Uwe

Wenn schon, dann Garbage Collection. Dann findet man es auch und kann nachschauen, was es bedeutet. Wer nen C64 hatte, kann sich bestimmt noch daran erinnern.

Wer nen C64 hatte, kann sich bestimmt noch daran erinnern

Jeder der "managed code" verwendet, nutzt es. C#, Java etc.
Wenn es einem python-Programmierer fremd ist, ist der nur nicht tief genug drin.

Und wenn man es in C++/C richtig macht, [mit (new / delete) bzw. (malloc/free) ] geht es auch ganz gut, mal abgesehen davon, dass praktisch kein Speicher für solche Spielchen vorhanden ist.

Dass die eigentliche Frage daneben ist, wurde aber schon diskutiert:

const char text[] = "Dieser RAM Bereich kann nie freigegeben werden, weil er schon belegt ist, bevor die erste Anweisung von setup() ausgeführt wird, und verfügbar sein muss, solange der Arduino läuft";

Und Text im PROGMEM kann man normalerweise erst recht nicht freigeben oder nach dem Bootloader noch ändern.

Und Text im PROGMEM kann man normalerweise erst recht nicht freigeben oder nach dem Bootloader noch ändern.

Und genau darum belegt es kein RAM!

Also sollte dir richtige Antwort lauten: Nutze das F() Makro.
(vermute ich mal)

Hi

Dann kann man den Quark auch gleich in einem externem EEprom ablegen - dann hat man im Arduino wieder massig Platz zum Spielen.

MfG

Hallo Zusammen

Ich Danke allen

nehme PROGMEM, PSTR() das reicht dann das F() kannte Ich schon
und benutze es auch

malloc/free ist Mir zu gefährlich wenn man es nicht richtigt macht
stürzt der Arduino ab

Gruss juergen