Go Down

Topic: Basta la Ram ? (Read 1 time) previous topic - next topic

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?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

ratto93

Con l'ide di arduino direttamente... non credo....
tramite AVR dude e AVR studio penso di si...
Se corri veloce come un fulmine, ti schianterai come un tuono.

uwefed


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

leo72

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.

Testato

grazie a tutti (incluso l'uomo flame)  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astroz78

Non basta mai la RAM....ehhhhhhhh se ci fosse solo un po' più di RAM quante belle cosette in più si potrebbero fare! :)
OpenDomotica ...la domotica con Arduino - www.opendomotica.it

ratto93


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

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..
Se corri veloce come un fulmine, ti schianterai come un tuono.

leo72

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à  ;) ).

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:

Code: [Select]
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:

Code: [Select]

cd /tmp/build8298356062385171079.tmp


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

Code: [Select]
avr-size -C --mcu=atmega328p Blink.cpp.elf

Ecco cosa risponde avr-size:

Code: [Select]
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.

uwefed

Grazie Leo
ora é chiaro.
Ciao Uwe

Testato


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
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

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.

Testato

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 ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lesto

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Testato

bella questa, e potresti fare un esempio pratico come ha fatto leo ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lesto

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

l'ultimo metodo, composto da memoryfree.cpp, memoryfree.h e uno sketch di esempio
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up