Donnerstag, 9. Februar 2017

Arduino Speicherproblem, kein RAM mehr, out of free RAM

bei großen Projekten geht der Ram eines Arduino uno schneller zu neige als man denkt.
unsere Frischwasserstation nutzt einen Arduino und dort gab es mitlerweile Probleme.
der Funktionsumfang ist seit dem Bau erheblich gewachsen:

Frischwasserstation Anzeige im smarthome fhem
als es dann beim kompillieren die Warnung für wenig freien Ram gab, folgten auch die ersten Abstürze:



das eigentliche Problem sind nicht etwa Variablen, sondern die vielen Zeichenketten, die über die serielle Schnittstelle und über MQTT zum smarthome übertragen werden.
folgendes Beispiel soll dies verdeutlichen:


dieser Sketch macht nichts anderes als etwas Text auf der Schnittstelle auszugeben. der avr lädt aber die Literale beim Start in den RAM, somit sind 21% einfach weg. um dieses Problem zu beheben kann man sich des F() Makros behelfen:


nun werden die Literale nicht mehr in den RAM geladen, leider funktioniert das nur bei den print Befehlen.

andere Funktionen die eine Zeichenkette (char) erwarten, wollen sie auch im RAM liegen haben.

dazu kann man sich ein eigenes Makro schreiben:

char StringBuffer[80];
#define P(str) strncpy_P(StringBuffer, PSTR(str), sizeof(StringBuffer))

ab jetzt können Literale auch an Funktionen übergeben werden die einen char im RAM erwarten, da er ja vorher ins RAM kopiert worden ist. die größe des StringBuffer sollte man etwas größer wählen als die längste Zeichenkette [80].

ein Beispiel sähe dann so aus:
client.publish(P("/Frischwasserstation1/VorlaufHeizung"), [char] );


in diesem Sinne frohes programmieren.



Keine Kommentare:

Kommentar veröffentlichen