Frage zum Speicher

Hallo,

der Code meines aktuellen Projekts enthält viele Zeilen wie z.B.:

client.println("<input type=\"checkbox\" name=\"aMo\" ");
if (autoActivate[0]) client.println("checked");
client.println(" \\> Montag
");
client.println("<input type=\"checkbox\" name=\"aTu\" ");
if (autoActivate[1]) client.println("checked");
client.println(" \\> Dienstag
");
client.println("<input type=\"checkbox\" name=\"aWe\" ");
if (autoActivate[2]) client.println("checked");
client.println(" \\> Mittwoch
");
client.println("<input type=\"checkbox\" name=\"aTh\" ");
if (autoActivate[3]) client.println("checked");
client.println(" \\> Donnerstag
");
client.println("<input type=\"checkbox\" name=\"aFr\" ");
if (autoActivate[4]) client.println("checked");
client.println(" \\> Freitag
");
client.println("<input type=\"checkbox\" name=\"aSa\" ");
if (autoActivate[5]) client.println("checked");
client.println(" \\> Samstag
");
client.println("<input type=\"checkbox\" name=\"aSu\" ");
if (autoActivate[6]) client.println("checked");
client.println(" \\> Sonntag

");
// Speichern-Button
client.println("<input type=hidden name=autoSave>");
client.println("<input type=submit style=\"height: 23px; width: 80px\" value=\"Speichern\"></form>");]
client.println("<input type=\"checkbox\" name=\"aMo\" ");
if (autoActivate[0]) client.println("checked");
client.println(" \\> Montag
");
client.println("<input type=\"checkbox\" name=\"aTu\" ");
if (autoActivate[1]) client.println("checked");
client.println(" \\> Dienstag
");
client.println("<input type=\"checkbox\" name=\"aWe\" ");
if (autoActivate[2]) client.println("checked");
client.println(" \\> Mittwoch
");
client.println("<input type=\"checkbox\" name=\"aTh\" ");
if (autoActivate[3]) client.println("checked");
client.println(" \\> Donnerstag
");
client.println("<input type=\"checkbox\" name=\"aFr\" ");
if (autoActivate[4]) client.println("checked");
client.println(" \\> Freitag
");
client.println("<input type=\"checkbox\" name=\"aSa\" ");
if (autoActivate[5]) client.println("checked");
client.println(" \\> Samstag
");
client.println("<input type=\"checkbox\" name=\"aSu\" ");
if (autoActivate[6]) client.println("checked");
client.println(" \\> Sonntag

");
// Speichern-Button
client.println("<input type=hidden name=autoSave>");
client.println("<input type=submit style=\"height: 23px; width: 80px\" value=\"Speichern\"></form>");

(Bestandteil einer Funktion “void printWebpage()”. Eigentlich geht es hier nicht um den konkreten Code)

Aufgrund dessen bin ich mit der Speicherauslastung meines Mega 2560 am Limit angelangt, was dazu führt, dass mein Sketch abstürzt, wenn ich auch nur eine Codezeile hinzufüge. Gibt es eine Möglichkeit, solche Strings irgendwie anders zu behandeln, so dass sie weniger SRAM beanspruchen? Überhaupt wäre ich ganz dankbar für Informationsquellen hinsichtlich der Speicherverwaltung beim Arduino, so ganz klar ist mir das alles nicht :slight_smile:

Vielen Dank für Hinweise!

Der ATmega2560 hat die Möglichkeit das interne Ram durch ein externes Ram bis auf 64kByte zu erweitern. Dazu blockiet man 20 Pins. ( 4 Steuerleitungen, 8 Adressleitungen und 8 Daten/Adressleitungen). Man verwendet ein 128KByte SRAM weil es keine geeigneten 64KByte Ram gibt. A16 wird auf Masse oder +5V gelegt. Ein Board mit zusätzlichen RAM: http://www.siphec.com/item/ATm2560-UF-TB.html Beispiel in der Beschreibung des SKT500 http://www.atmel.com/dyn/resources/prod_documents/DOC2491.PDF Kapitel 2.5 External SRAM auf Seite 12 Erweiterungsboard für Arduino Mega / Mega2560: http://ruggedcircuits.com/html/megaram.html Es muß ein Bit gesetzt werden damit der ATmega das Ram als internes Ram annimmt.

http://ruggedcircuits.com/html/megaram.html: Enabling the External Memory Interface

Most of the pins used for accessing external RAM are automatically taken care of by the microcontroller. In order to enable the external memory interface, the SRE bit in the XMCRA (External Memory Control Register A) has to be set:

XMCRA = _BV(SRE); The external RAM on the MegaRAM is fast enough to support zero-wait-state operation so all other bits in the XMCRA register can be set to 0.

Grüße Uwe

Probier mal:

...println(F("text"));

Das sollte die text-strings auch zur laufzeit im FLASH belassen.

Fuer tiefere einsichten einfach mal nach "AVR PROGMEM" googeln ;-)

Eine weitere Möglichkeit wäre, den gemeinsamen Text jeweils in eine Konstante auszulagern:

z. B. gibt es die Strings
"<input type=“checkbox” name=“aMo” "
"<input type=“checkbox” name=“aTu” "
"<input type=“checkbox” name=“aWe” "

etc.

Wenn du eine Konstante definierst, die nur

“<input type=“checkbox” name=”

enthält und die Konstanten “aMo”, “aTu”, etc. zur Laufzeit hinzufügst, dann sollte die Konstante letztlich nur einmal im Speicher landen -kostet halt zur Laufzeit ein bißchen Zeit.

Musst du mal ein bißchen rumprobieren, der Compiler sollte das nur einmal als Text ablegen

Rudi

Ich habe es hingekriegt!

PROGMEM war das richtige Stichwort.

Sehr komfortabel geht es mit dieser Bibliothek:

http://arduiniana.org/libraries/flash/

Dann kann man wirklich einfach schreiben:

client << F(“HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n”);

Schwierigkeiten habe ich jetzt nur noch mit sowas:

client.println(eventText);

wobei eventText definiert ist als char eventText[15]. Der Compiler meint, er könne die Länge von dem string nicht bestimmen. Naja das ist nicht so schlimm, man kann die beiden Methoden auch problemlos gemischt nutzen.