Vai al contenuto

5 luglio 2011

9

Risparmiare memoria su Arduino

ArduinoQuando si programma un microcontrollore, le risorse a disposizione sono molto più limitate di quanto normalmente si ha nello sviluppo su PC e bisogna tenerne conto se si vuole creare progetti di una certa complessità. Uno dei limiti più grandi con cui mi sono scontrato, nella programmazione di Arduino, è quello della RAM a disposizione che, nelle schede che montano il chip Atmel ATmega328, è limitata a soli 2KB, ovvero dei miseri 2048 byte. Con un paio di accortezze si può risparmiare memoria a sufficienza per poter gestire una discreta quantità di dati.

Il passo più semplice, per ridurre l’uso della RAM occupata, è di dimensionare accuratamente le variabili e gli array, cercando di identificare la dimensione massima dei dati che dovranno contenere: un array di 100 caratteri che conterrà al massimo una stringa di 20 caratteri, spreca 80 byte di RAM che vengono comunque allocati, anche se non utilizzati.

Oltre alle variabili, però, entrano in gioco anche la complessità del codice, le chiamate a funzioni nidificate, gli oggetti istanziati e le stringhe di testo tra i fattori che incrementano l’uso di memoria, alcuni dei quali non sono facilmente identificabili e gestibili.

Ottimizzate le variabili, quindi, resta poco spazio di manovra per ridurre ulteriormente il consumo di memoria. Tra i fattori scritti poco fa, ce n’è un’altro che può essere facilmente gestito dal programmatore ed è la quantità di stringhe di testo presenti le codice. Queste vengono sempre allocate in RAM, anche se sono dei semplici testi dentro una Serial.print() e, quindi, non ci sembrano associate a una variabile. Usando funzioni specifiche, è possibile spostare il contenuto di queste stringhe dentro la memoria flash del microprocessore, in cui risiede il codice, che solitamente è molto più ampia (circa 32KB per l’ATmega328).

Questa tecnica fa uso della parola chiave PROGMEM per inserire la stringa nella flash e della funzione strcpy_P per recuperarla e copiarla in una variabile che potrà poi essere usata come di consueto. Di seguito un esempio di utilizzo:

#include <avr/pgmspace.h>

prog_uchar PROGMEM stringInFlash[] = {“Questa stringa verrà memorizzata nella flash e non nella RAM”};

char buffer[60]; // Deve poter contenere la stringa più lunga.
strcpy_P(buffer, stringInFlash);
Serial.println(buffer);

Leggi altro da Arduino

Articoli simili:

Usare printf su Arduino per concatenare le stringhe da stampare
VisualMicro - Programmare Arduino con Visual Studio
Arduino Day 2012
  1. Lug 5 2011

    …intanto metto “Mi piace” …poi leggo!!! 😛

  2. Lug 5 2011

    si pero’ che palle …

  3. Lug 5 2011

    ???

  4. Lug 5 2011

    Ma si chiama come mio nonno?!?!?! Ma non ci posso credere!!! 🙂

  5. Lug 5 2011

    @Dario … che palle stare a combattere con la ram … non che palle il post 😉

  6. Andrea
    Lug 11 2011

    molto interessante questo progetto. volevo segnalarti un progetto che riassume in pieno l’essenza di Facebook e la porta nel mondo reale grazie ad Arduino: si tratta di un Facebook Notifier, praticamente il notificatore di messaggi Facebook inversione hardware, reale, che comunica con il PC tramite collegamento USB. La presenza di notifiche si segnala con la bandiera gialla alzata, che si abbassa quando queste vengono lette.
    http://it.emcelettronica.com/arduino-sbarca-su-facebook

  7. Xyz
    Gen 4 2013

    Ciao, volevo segnalarti che così non funziona:

    prog_uchar PROGMEM stringInFlash[]

    invece così si:

    prog_char PROGMEM stringInFlash[]

    Per il resto è una funzione molto utile, anche se si ciuccia parecchia memoria flash.

  8. Babbubba
    Dic 31 2013

    Ma la flash nn ha un tot di scriiture massime poi si brucia?

  9. Ernstfree
    Gen 23 2015

    2 k? ma siamo a metà del commodore VIC20! Possibile?

Condividi ciò che pensi, scrivi un commento.

(required)
(required)

Nota: HTML è permesso. Il tuo indirizzo e-mail non sarà mai pubblicato.

Sottoscrivi i commenti