Chiarimenti su memoria

Salve a tutti,

leggendo dal datasheet del'UNO c'è scritto;

Flash Memory 32 KB (ATmega328) of which 0.5 KB used by bootloader
SRAM 2 KB (ATmega328)
EEPROM 1 KB (ATmega328)

Quando compilo i sorgenti sotto compare qualcosa del tipo:

Dimensione del file binario dello sketch: 26.390 bytes (su un massimo di 32.256 bytes)

quindi la flash memory è stata occupata per 26K circa dei 32K giusto?

La SRAM per cosa viene usata? Se io ho dichiarato queste variabili

char ID[11];
char srvDNS[51];
char srvPORT[6];
int timeWait;
int numInterval;
char sms1[11];
char sms2[11];

dove vengono allocate? Grazie.

La SRAM viene occupata dallo HEAP (mucchio) e dallo STACK (catasta) più che altro.

Parole misteriose per definire l'area che contiene i valori delle variabili e quella che contiene i rinvii delle subroutine.

In realtà le cose sono un po' più complicate, ma dovrebbe bastarti come risposta.

Ettore Massimo Albani

e perché dovrebbe bastargli? mica sei tu a poter stabilire il limite del sapere di chi chiede :wink: così gli tagli ogni possibilità di approfondimento :disappointed_relieved: D'altra parte solo ora faccio caso al tuo "personal text" ]:D; ricordando un battuta che mi hai fatto non molto tempo fa devo dedurre che non hai mai avuto un buon rapporto con la classe insegnante e temo proprio che il problema sia stato bidirezionale :stuck_out_tongue_closed_eyes:

cyberhs:
Parole misteriose per definire l'area che contiene i valori delle variabili e quella che contiene i rinvii delle subroutine.

Nello stack vanno anche le variabili locali.

Risposta piú semplice: Nella RAM vanno le variabili dello Sketch e le variabili del sistema (per esempio lo Stack). Lo stak é una parte di memoria dove per esempio vengono memorizzate dati come indirizzi di ritorno da subrotine) Non c'é controllo se si cerca di usare piú RAM di quella disponibile. Quando si usano tanti variabili (per esempio array) oppure si stampa sulla seriale tante stringhe vengono sovrascrite dalle variabili del Sketch l' aria riservata per le variabili di sistema e l' Arduino si blocca misteriosamente.

Arduino non usa normalmente la memoria EEPROM. Puoi usara Tu nel Tuo sketch con la libreria EEPROM
Nel ATmega328 non é possiblie espandere la memoria (RAM, o FLASH) esternamente per avere piú memoria interna per le variabili.
È possibile sulla ATmega1280 e 2560 di aggiungere una RAM esterna per avere 64kByte di RAm interna. Si perdono ca 20 piedini per questo. http://ruggedcircuits.com/html/megaram.html

Ciao Uwe

Per completare il discorso, esistono dei metodi per conoscere l'occupazione statica e dinamica della SRAM.
Si può vedere la memoria RAM usata staticamente (quindi come stack e creazione di variabili) dopo aver compilato il proprio sketch. Basta spostarsi nella cartella temporanea che l'Arduino crea in /tmp/buildxxxxxxxxxxxxxxxxxx (su Windows non mi ricordo dove la mette), aprire un terminale e dare "avr-size nome_file_sketch.elf -C".
Ti verrà restituita l'occupazione di flash e di Ram del tuo sketch.

A livello dinamico (ossia con lo sketch in esecuzione) puoi provare questo:
http://arduino.cc/playground/Code/AvailableMemory

Grazie a tutti. Solo ora ho avuto modo di leggere le vostre risposte. Devo provare con avr-size.

So cos'è un heap o uno stack. Una variabile dichiarata in una funzione vive solo in quella funzione? Cioè se dichiaro un array di 10 interi in questa funzione e nel loop() prima di chiamare questa funzione ho 100byte liberi dopo la funzione ne dovrei avere ancora 100 o no? Oppure tutto quello che viene dichiarato, comprese le variabili delle funzioni, viene allocato staticamente? Grazie.

x iscrizione