Arduino – FLASH / SRAM / EEPROM geheugen
Deze pagina omvat een aantal geheugentips voor het gebruik van een arduino.
De Arduino kent 3 soorten geheugen:
1) FLASH, in dit geheugen wordt je sketch opgeslagen.
2) SRAM, hierin staan de variabelen en manipulatie van de sketch, dit geheugen gaat verloren wanneer de arduino uitgeschakeld wordt.
3) EEPROM, dit is “vast” geheugen voor opslag van gegevens die voor lange tijd bewaard moet blijven.
Waarom is dit belangrijk om te weten?
Wanneer je een programma (sketch) maakt met de Arduino IDE, kun je beter het geheugen beheren, door er handig mee om te gaan.
Als je bijvoorbeeld een string gebruikt, zoals “Hallo Wereld” dan wordt het opgeslagen in het SRAM geheugen, als je veel van deze variabelen of strings hebt, dan heb je al snel een geheugentekort!
Geheugenoverzicht Arduino’s:
ATMega168 | ATMega328P | ATmega1280 | ATmega2560 | |
---|---|---|---|---|
Flash (1 Kbyte used for bootloader) |
16 KBytes | 32 KBytes | 128 KBytes | 256 KBytes |
SRAM | 1024 bytes | 2048 bytes | 8 KBytes | 8 KBytes |
EEPROM | 512 bytes | 1024 bytes | 4 KBytes | 4 KBytes |
Welk geheugen moet ik gebruiken voor opslag?
Dat hangt geheel af van het gebruik van de arduino en applicatie, het geheugen is een bepaald aantal keer te (her)schrijven:
EEPROM kan tot 100.000 wis/schrijf handelingen ondervinden voordat het vergaat (end of life), en FLASH 10.000 wis/schrijf handelingen.
- Snel veranderende variabelen kunnen het beste in SRAM wordne opgeslagen.
- Statische strings kunnen het beste worden opgeslagen het FLASH geheugen.
Hoe gebruik ik het?
Hieronder vind je een aantal voorbeelden om verschillende geheugen te gebruiken op de arduino, de arduino IDE ondersteunt nu ook F(), welke helpt om een string in het FLASH geheugen te zetten.
FLASH geheugen
Voorbeeld om een string in het flash geheugen op te slaan.
1 2 |
Serial.println("Dit is een string in SRAM"); Serial.println(F("Dit is een string nu in het FLASH geheugen")); |
EEPROM geheugen
Hieronder volgt een voorbeeld om het getal 123 in het EEPROM geheugen weg te schrijven, dit blijft in het geheugen staan, zelfs nadat de arduino is uitgeschakeld.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <EEPROM.h> // eeprom bibliotheek inladen int adres = 0; // Het adres in de EEPROM (0-511 byte) int waarde = 123; // De waarde om op te slaan (een getal tussen de 0 t/m 255). void setup() { Serial.begin(9600); // Start de seriele poort. EEPROM.write(adres, waarde); // Wegschrijven van de waarde in de EEPROM. Serial.println(EEPROM.read(adres)); // Lees de waarde uit op adres. } void loop() { delay(1000); } |
Een ander voorbeeld is om een analoge “sensor” waarde als een logboekje weg te schrijven over een uur, 3600 / 512 byte = ca. 7 seconden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
* EEPROM Write * * Stores values read from analog input 0 into the EEPROM. * These values will stay in the EEPROM when the board is * turned off and may be retrieved later by another sketch. */ #include <EEPROM.h> // the current address in the EEPROM (i.e. which byte we're going to write to next) int addr = 0; void setup() { } void loop() { // need to divide by 4 because analog inputs range from // 0 to 1023 and each byte of the EEPROM can only hold a // value from 0 to 255. int val = analogRead(0) / 4; // write the value to the appropriate byte of the EEPROM. // these values will remain there when the board is // turned off. EEPROM.write(addr, val); // advance to the next address. there are 512 bytes in // the EEPROM, so go back to 0 when we hit 512. addr = addr + 1; if (addr == 512) addr = 0; delay(5000); } |
SRAM geheugen
Voor het gebruik van SRAM is geen speciale code nodig die je moet gebruiken bij het programmeren, dit geheugen wordt automatisch aangesproken met variabelen uit je sketch.
Je kan kijken hoeveel geheugen er nog vrij is op de arduino met onderstaande code, deze code is puur voor controle doeleinden, je moet het niet gebruiken in een officiële sketch.
1 2 3 4 5 6 7 8 9 10 |
int availableMemory() { int size = 1024; // Gebruik 2048 met de ATmega328 byte *buf; while ((buf = (byte *) malloc(--size)) == NULL) ; free(buf); return size; } |
Tips voor zuiniger geheugengebruik
1) F() alle strings, dit zal SRAM schelen.
2) Verwijder alle onnodig variabelen, functies, en #includes.
3) Gebruik de correcte array grootte!, als je bijvoorbeeld a[55] reserveert, en je gebruikt maar a[5], dan blijft altijd onnodig geheugen gereserveerd.
4) Gebruik zo veel mogelijk functies, alle parameters en variableen die naar een functie wijzen, worden automatisch geleegd.
5) Gebruik de juiste datatypen zoals int, Double, Float, voor je variabelen.