Speichermanagement


Der Spei­cher der Ardui­nos wird für grö­ße­re Pro­gram­me oft knapp. Das geschieht beson­ders dann, wenn vie­le ⇒Varia­ble und ⇒Arrays ver­wen­det wer­den oder die Anwei­sung ⇒Serial.print häu­fig benutzt wird.
Aller­dings unter­schei­den sich die ver­schie­de­nen Ardui­nos in der ⇒Spei­cher­aus­stat­tung.

Es gibt ver­schie­de­ne Mög­lich­kei­ten, den ver­wen­de­ten Spei­cher zu opti­mie­ren.

Ver­wen­dung von Varia­blen mit dem geringst­mög­li­chen Spei­cher­be­darf

Je nach Ver­wen­dungs­zweck und der benö­tig­ten Grö­ße soll­test du den Varia­blen­typ ver­wen­den, der die Anfor­de­run­gen erfüllt und gleich­zei­tig den gerings­ten Spei­cher­platz bean­sprucht.

Varia­bleGel­tungs­be­reichSpei­cher­be­darfBezeich­nung in C
byteGan­zah­len 0 bis 2551 Byte (8 Bits)signed char
intGanz­zah­le­n­ah­len -32.768 bis 32.7672 Bytes (16 Bits)int16_t
unsi­gned intGanz­zah­len 0 bis 65.5354 Bytes (32 Bits)uint16_t
long-2.147.483.648 bis 2.147.483.6474 Byte (32 Bits)int32_t
unsi­gned long0 bis 4.294.967.2954 Byte (32 Bits)uint32_t
floatDezi­mal­zah­len4 Byte (32 Bits)float

F-Makro

In vie­len Pro­gram­men wer­den ⇒Serial.print/Serial.println-Anwei­sun­gen aus­ge­führt. Jede die­ser Anwei­sun­gen belegt Spei­cher­platz im ⇒SRAM. Da es sich aber nicht um einen unver­än­der­li­chen String han­delt, ist die Spei­che­rung im SRAM nicht not­wen­dig.

Das F-Makro sorgt dafür, dass der Text nicht im SRAM ver­bleibt, er wird viel­mehr im deut­lich grö­ße­ren ⇒Flash abge­legt und stellt so Spei­cher­platz für Varia­blen im SRAM zur Ver­fü­gung.

Bei­spiel:

Serial.println(F("Initialisierung abgeschlossen")); 
Serial.println(F("Schreibe Messdaten in die Datei Messung.csv: ")); 
Serial.println(F("-----------------------------------");

PROGMEM

PROGMEM weist den Com­pi­ler an, die Daten im ⇒Flash-Spei­cher abzu­le­gen.

Info
Dies gilt aber nur für Varia­ble, die einen unver­än­der­li­chen Wert (Kon­stan­te) haben. Sie müs­sen glo­bal im Kopf des Pro­gramms defi­niert wer­den.

Das Pro­gramm erstellt ein Array von belie­bi­gen Zah­len klei­ner als 255. Anschlie­ßend wird eine zufäl­li­ge Posi­ti­on im Array bestimmt und die sich dort befin­den­de Zahl wird ange­zeigt.

So sieht es aus:

Das fol­gen­de Pro­gramm wur­de ohne die Opti­mie­rung des Spei­cher­plat­zes erstellt:

Das Pro­gramm mit Opti­mie­rung:

  • es wur­de ein Varia­blen­typ ver­wen­det, der weni­ger Spei­cher­platz ver­braucht (byte statt int)
  • alle kon­stan­ten Varia­blen wur­den mit PROGMEM defi­niert
  • alle Serial.print/Serial.println-Anweisungen wer­den mit dem ⇒F-Makro aus­ge­führt

Ein wei­te­res, aus­führ­li­che­res Bei­spiel:

Obwohl das Pro­gramm deut­lich umfang­rei­cher ist, wird nicht mehr Spei­cher ver­braucht.

Das Pro­gramm ohne Opti­mie­rung benö­tigt mehr als dop­pelt so viel Spei­cher:



Letzte Aktualisierung: Aug. 4, 2026 @ 21:11