Optimalisatie
Programmeren op laag niveau voor embedded systemen is heel anders dan programmeren voor apparaten voor algemeen gebruik, zoals computers en mobiele telefoons. Efficiëntie (in termen van snelheid en ruimte) is veel belangrijker omdat middelen schaars zijn. Dat betekent dat het allereerste dat u moet doen als u onvoldoende ruimte heeft, is kijken naar welke delen van uw code u kunt optimaliseren.
In termen van het verminderen van het gebruik van programmaruimte (Flash), kan de codegrootte best moeilijk te optimaliseren als je onervaren bent, of als je meer gewend bent aan programmeren voor desktopcomputers die die vaardigheid meestal niet nodig hebben. Helaas is er geen 'magische kogel'-benadering die in alle situaties werkt, hoewel het helpt als je serieus bedenkt wat je sketch echt nodig heeft . Als een functie niet nodig is, verwijder deze dan.
Soms is het ook handig om te bepalen waar meerdere delen van uw code hetzelfde zijn (of erg op elkaar lijken). Mogelijk kunt u ze condenseren tot herbruikbare functies die vanaf meerdere plaatsen kunnen worden aangeroepen. Houd er echter rekening mee dat als u probeert code ook herbruikbaar te maken, deze uiteindelijk meer uitgebreid maakt. Het is een lastige balans om te vinden die meestal met oefenen gepaard gaat. Het kan helpen om wat tijd te besteden aan het bekijken van hoe codewijzigingen de compileruitvoer beïnvloeden.
Runtime-gegevens (SRAM) -optimalisatie is meestal wat gemakkelijker als je eraan gewend bent. Een veel voorkomende valkuil voor beginnende programmeurs is het gebruik van te veel globale data. Alles dat op globaal niveau wordt gedeclareerd, blijft bestaan gedurende de hele levensduur van de schets, en dat is niet altijd nodig. Als een variabele alleen binnen één functie wordt gebruikt en deze niet hoeft te blijven bestaan tussen aanroepen, maak er dan een lokale variabele van. Als een waarde tussen functies moet worden gedeeld, overweeg dan of u deze als parameter kunt doorgeven in plaats van deze globaal te maken. Op die manier gebruik je SRAM alleen voor die variabelen wanneer je het echt nodig hebt.
Een andere moordenaar voor SRAM-gebruik is tekstverwerking (bijvoorbeeld door de klasse String
te gebruiken). Over het algemeen moet u indien mogelijk String-bewerkingen vermijden. Het zijn enorme geheugenvarkens. Als u bijvoorbeeld veel tekst naar serieel uitvoert, gebruikt u meerdere aanroepen naar Serial.print ()
in plaats van stringconcatenatie. Probeer indien mogelijk ook het aantal letterlijke tekenreeksen in uw code te verminderen.
Voorkom ook indien mogelijk recursie. Elke keer dat een recursieve call wordt gedaan, wordt de stack een niveau dieper. Refactoreer uw recursieve functies om in plaats daarvan iteratief te zijn.
Gebruik EEPROM
EEPROM wordt gebruikt voor langdurige opslag van dingen die slechts af en toe veranderen. Als u grote lijsten of opzoektabellen met vaste gegevens moet gebruiken, overweeg dan om deze van tevoren in EEPROM op te slaan en alleen te verwijderen wat u nodig heeft wanneer dat nodig is.
Het is duidelijk dat EEPROM vrij beperkt is in omvang en snelheid, en heeft een beperkt aantal schrijfcycli. Het is geen geweldige oplossing voor gegevensbeperkingen, maar het kan voldoende zijn om de belasting van Flash of SRAM te verlichten. Het is ook heel goed mogelijk om te communiceren met vergelijkbare externe opslag, zoals een SD-kaart.
Uitbreiding
Als je alle andere opties hebt uitgeput, is uitbreiding misschien een mogelijkheid . Helaas is het niet mogelijk om het Flash-geheugen uit te breiden om de programmaruimte te vergroten. Het is echter mogelijk om SRAM uit te breiden. Dit betekent dat u uw sketch wellicht kunt refactoren om de codegrootte te verkleinen ten koste van de grotere gegevensomvang.
Meer SRAM verkrijgen is eigenlijk vrij eenvoudig. Een mogelijkheid is om een of meer 23K256 chips te gebruiken. Ze zijn toegankelijk via SPI en er is de SpiRAM-bibliotheek om u te helpen ze te gebruiken. Pas echter op dat ze werken op 3,3V niet 5V!
Als je de Mega gebruikt, kun je als alternatief SRAM-uitbreidingsschilden krijgen van Lagrangian Point of Rugged Circuits .