Ottimizzazione
La programmazione di basso livello per sistemi embedded è molto diversa dalla programmazione per dispositivi di uso generale, come computer e telefoni cellulari. L'efficienza (in termini di velocità e spazio) è molto più importante perché le risorse sono a un prezzo elevato. Ciò significa che la prima cosa da fare se si esaurisce lo spazio è esaminare quali parti del codice è possibile ottimizzare.
In termini di riduzione dell'utilizzo dello spazio del programma (Flash), la dimensione del codice può essere piuttosto difficile da ottimizzare se non si ha esperienza o se si è più abituati alla programmazione per computer desktop che non hanno bisogno di tale competenza. Sfortunatamente, non esiste un approccio a "proiettile magico" che funzioni in tutte le situazioni, anche se aiuta a considerare seriamente ciò che il tuo schizzo deve davvero avere. Se una funzione non è necessaria, eliminala.
A volte è anche utile identificare dove più parti del codice sono uguali (o molto simili). Potresti essere in grado di condensarli in funzioni riutilizzabili che possono essere chiamate da più punti. Tuttavia, tieni presente che a volte provare a rendere il codice troppo riutilizzabile finisce per renderlo più dettagliato. È un equilibrio difficile da colpire che tende a venire con la pratica. Trascorrere del tempo a guardare come le modifiche al codice influiscono sull'output del compilatore può aiutare.
L'ottimizzazione dei dati di runtime (SRAM) tende ad essere un po 'più semplice quando ci si è abituati. Una trappola molto comune per i programmatori principianti sta usando troppi dati globali. Tutto ciò che viene dichiarato nell'ambito globale esisterà per l'intera durata dello schizzo e ciò non è sempre necessario. Se una variabile viene utilizzata solo all'interno di una funzione e non deve persistere tra le chiamate, impostarla come variabile locale. Se un valore deve essere condiviso tra le funzioni, considerare se è possibile passarlo come parametro invece di renderlo globale. In questo modo utilizzerai SRAM per quelle variabili solo quando ne avrai davvero bisogno.
Un altro killer per l'utilizzo di SRAM è l'elaborazione del testo (ad es. Utilizzando la String
classe). In generale, dovresti evitare di eseguire operazioni su String, se possibile. Sono enormi maiali della memoria. Ad esempio, se si sta inviando molto testo in seriale, utilizzare più chiamate Serial.print()
invece di utilizzare la concatenazione di stringhe. Prova anche a ridurre il numero di letterali stringa nel tuo codice, se possibile.
Evitare anche la ricorsione, se possibile. Ogni volta che viene effettuata una chiamata ricorsiva, lo stack raggiunge un livello più profondo. Rifattorizza invece le tue funzioni ricorsive in modo iterativo.
Usa EEPROM
EEPROM è usato per conservare a lungo termine cose che cambiano solo occasionalmente. Se è necessario utilizzare elenchi di grandi dimensioni o tabelle di ricerca di dati fissi, prendere in considerazione la possibilità di archiviarli in anticipo in EEPROM e di estrarre ciò di cui si ha bisogno solo quando necessario.
Ovviamente EEPROM ha dimensioni e velocità piuttosto limitate e ha un numero limitato di cicli di scrittura. Non è un'ottima soluzione alle limitazioni dei dati, ma potrebbe essere sufficiente per alleviare l'onere per Flash o SRAM. È anche del tutto possibile interfacciarsi con una memoria esterna simile, come una scheda SD.
Espansione
Se hai esaurito tutte le altre opzioni, l'espansione potrebbe essere una possibilità. Sfortunatamente, non è possibile espandere la memoria Flash per aumentare lo spazio del programma. Tuttavia, è possibile espandere SRAM. Ciò significa che potresti essere in grado di riformattare il tuo schizzo per ridurre la dimensione del codice a spese dell'aumento della dimensione dei dati.
Ottenere più SRAM è in realtà abbastanza semplice. Un'opzione è utilizzare uno o più chip 23K256 . Sono accessibili tramite SPI e c'è la libreria SpiRAM per aiutarti a usarli. Basta fare attenzione che funzionano a 3,3 V non a 5 V!
Se stai usando il Mega, puoi in alternativa ottenere scudi di espansione SRAM da Lagrangian Point o Rugged Circuits .