Basta la Ram ?

Come si fa a capire se la ram disponibile sul micro e' sufficiente per un determinat sketch ?

C'e' un modo per controllare in realtime quanta se ne sta usando?

Con l'ide di arduino direttamente... non credo....
tramite AVR dude e AVR studio penso di si...

Testato:
Come si fa a capire se la ram disponibile sul micro e' sufficiente per un determinat sketch ?
C'e' un modo per controllare in realtime quanta se ne sta usando?

Ti do una risposta fatalistica: quando incomincia ad impazzire Arduino viene usato troppa Ram.

Come dice ratto93
i programmi fanno una previsione ma durante il funzionamento non c'é un processo supervisore di uso RAM.

Ciao Uwe

Esiste il comando avr-size, se ne era già parlato tempo fa. Fa un'analisi della memoria usata dallo sketch. E' discretamente valido per avere a grandi linee la quantità di Ram impegnata.

grazie a tutti (incluso l'uomo flame) :slight_smile:

Non basta mai la RAM....ehhhhhhhh se ci fosse solo un po' più di RAM quante belle cosette in più si potrebbero fare! :slight_smile:

astroz78:
Non basta mai la RAM....ehhhhhhhh se ci fosse solo un po' più di RAM quante belle cosette in più si potrebbero fare! :slight_smile:

Puoi sempre passare a chip diversi.....
Al mega se non vuoi farti stanalone.... usare solo il chip del mega (ATmega1280/2560) montato su tuo PCB o adattatore + il tuo PCB
oppure puoi usare chip come il mega 664p 40pin dip con flash e ram maggiorata oltre che più porte disponibili..

Vi spiego a grandi linee come funziona il comando avr-size, che fa parte del pacchetto binutils-avr.

Esso serve a determinare, una volta prodotto lo sketch compilato che viene caricato nella memoria flash del micro, il consumo di memoria sia Flash che Ram. Ovviamente non potrà determinare mai la dimensione di un array creato dinamicamente perché non si può sapere a priori quanti elementi il codice andrà ad inserire (se ad esempio dipende da quante volte l'utente premerà un dato pulsantino, avr-size non può leggere nel pensiero dell'utente e sapere quanti click farà :wink: ).

Per usarlo, dovete compilare il vostro sketch premendo il pulsantino Compile, quello a forma di ">", contemporaneamente al tasto SHIFT, in modo che nella finestra di terminale dell'IDE in basso vediate la path di qual'è la cartella temporanea dove l'IDE sta lavorando.
Una volta che l'IDE vi dice "Done compiling", aprite un terminale in quella cartella e date avr-size nome_sketch.elf.
Vi verrà dato un riassunto della memoria usata dallo sketch. Per avere dati usabili dovete specificare il parametro -C, che serve a fornire un output già formattato con i dati in forma leggibile, ed il parametro --mcu=xxxx, che serve a specificare il micro target.

Facciamo un esempio. Usiamo il Blink.
Caricato nell'IDE, premo il tasto di compilazione col tasto shift ed ottengo nel terminale anche questo messaggio:

avr-objcopy -O ihex -R .eeprom /tmp/build8298356062385171079.tmp/Blink.cpp.elf /tmp/build8298356062385171079.tmp/Blink.cpp.hex

Ecco, quelle path indicano dove vengono creati i file temporanei. Adesso apriamo un terminale e spostiamoci in quella cartella:

cd /tmp/build8298356062385171079.tmp

Ora diamo il comando seguente (qui usiamo l'Atmega328):

avr-size -C --mcu=atmega328p Blink.cpp.elf

Ecco cosa risponde avr-size:

AVR Memory Usage
----------------                                                                                                                                            
Device: atmega328p
                                                                                                                                                            
Program:     990 bytes (3.0% Full)                                                                                                                          
(.text + .data + .bootloader)
                                                                                                                                                            
Data:          9 bytes (0.4% Full)                                                                                                                          
(.data + .bss + .noinit)

Il programma occupa 990 byte (il 3% della Flash disponibile) mentre i dati occupano solo 9 byte.

Grazie Leo
ora é chiaro.
Ciao Uwe

leo72:
Il programma occupa 990 byte (il 3% della Flash disponibile) mentre i dati occupano solo 9 byte.

Grazie mille per l'esempio pratico, solo un chiarimento, per PROGRAMMA da 990byte si intende quanto il listato di Blink occupa in flash, e per DATI intendi quanta Ram serve a blink per il normale funzionamento ?

grazie ancora

Sì.
Se provi a compilare lo sketch Blink, vedra che dopo che l'IDE ha dato il messaggio "Done compiling" scrive anche quanto spazio occupa lo sketch, che corrisponde proprio allo spazio dichiarato da avr-size (difatti l'IDE usa lo stesso comando).
In più, hai anche la SRAM impiegata dalle variabili e dallo stack del tuo programma.

quindi sarebbe sia facile che utile far scrivere oltre allo spazio anche la RAM dall'IDE Arduino.

se si prova a caricare un programma piu' grande della flash l'ide ti blocca giusto ? sarebbe utile che lo facesse anche sulla Ram.

in questo momento se io creo volutamente uno sketch che supera la quantita' di ram del 328, l'ide non blocca giusto ?

esiste anche un comando che restituisce la ram occupata in real-time, ed è presente nella libreria FATlib(che a sua volta credo la peschi dalla libreria AVR), restituisce la RAM allocata al momento della chiamata, quindi è il valore reale istantaneo.

Sta a te piazzare il comando in quelli che credi essere i momenti di maggiore utilizzo.

bella questa, e potresti fare un esempio pratico come ha fatto leo ?

http://www.arduino.cc/playground/Code/AvailableMemory

l'ultimo metodo, composto da memoryfree.cpp, memoryfree.h e uno sketch di esempio

lesto:
http://www.arduino.cc/playground/Code/AvailableMemory

l'ultimo metodo, composto da memoryfree.cpp, memoryfree.h e uno sketch di esempio

Bello questo :slight_smile:
più che altro è semplicissimo da usare 8)

Thanks

C'è da fare una considerazione.
Avr-size si usa prima di effettuare la programmazione, free() è una funzione da usare a runtime.
L'uno non pregiudica l'uso dell'altro anche se secondo me è più utile avr-size per avere un'idea di massima sul consumo di ram prima ancora di mandare ad esecuzione lo sketch. Inoltre free() è comodo ma se si ha un sistema di output per verificare il consumo istantaneo. Ma se si ha a che fare con un Tiny in standalone senza connessione seriale né LCD né altri modi, free() serve a poco.

è anche vero che se allochi memoria in base a condizioni dipendenti da un input esterno il metodo che usi non funziona. dipende tutto da cosa bisogna fare.