Go Down

Topic: Parere in merito al layout del flusso del programma (Read 2088 times) previous topic - next topic

hiperformance71



Si, hai ragione, ho fatto la prova con un semplice codice per verificare, ed effettivamente ci sono 6 byte in più se viene chiamata una funzione da loop, quindi forse devo rivedere qualche cosa, altrimenti mi ciuccia troppa RAM sta cosa! 

Attento a non confondere FLASH ed RAM (ed EEPROM).
Con i microcontrollori si ha a che fare con un'architettura informatica di tipo Harvard, dove la memoria che contiene il codice è separata dalla memoria in cui vengono create e gestite le variabili, ossia i dati generati dal programma.

La Flash contiene il codice, ed è una memoria non volatile riscrivibile: non essendo volatile, mantiene il tuo programma anche se stacchi l'alimentazione. La RAM è volatile per cui, una volta staccata l'alimentazione, tutti i dati elaborati vanno persi. Per contro, ha la possibilità di essere scritta un numero praticamente infinito di volte, mentre la Flash ha un limite di 10.000 riscritture.

Quando compili uno sketch e vedi 6 byte in più per il salto alla tua sub-routine (o funzione, chiamala come ti pare), si parla di memoria FLASH consumata in più. Il consumo della RAM non lo vedi da lì ma sappi che comunque cresce anche quello perché un salto prevede il salvataggio del punto di ritorno nello stack del programma, che è gestito in RAM.


Si, quello che spiegni lo sapevo già, ma non conoscendo come misurare o stimare la RAM in uso da una MCU ho assunto che se per un semplice spostamento di variabile, in FLASH guadagno o perdo 100bytes è da sperarsi che anche in RAM vi siano queste differenze anche se non si conosce la loro entità anche perché, se le variabili sono global, sono fissate nella RAM durante tutto il tempo che c'é alimantazione giusto? mentre se vengono dichiarate in funzioni, saranno variabili locali ed il sistema le userà solo mentre servono, uscito dalla funzione le cancellerà o renderà lo spazio occupato da questi dati libero di essere usato in un'altro posto del codice, giusto?
Approposito di limite di scritture della memoria interna (EEPROM in questo caso), ho visto un filmato su youtube di una prova fatta da alcuni ragazzi per collaudare quante riscritture durasse prima di dare errore, hanno creato un loop con contatore, dopo un po di tempo (non ricordo quanto) si è bloccato, facendo qualcosa come 126000 riscritture se non ricordo male!  interessante (quindi da tenere ben a mente quando si fanno dei loop che scrivono in EEPROM ma anche in FLASH, si rischia di rovinare la memoria!).

"The only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle" - Steve Jobs

hiperformance71

Grazie per il link al riguardo il passaggio di variabili, molto ben spiegato, ad una lettura veloce ho capito abbastanza come funziona, adesso me lo studierò per bene per capirlo al meglio e magari riscrivere qualche riga dei programmi che sto facendo per vedere quanto miglioriamo nel risparmio di prezionsa FLASH e sperando che altrettanto ancora più preziona RAM che non è mai abbastanza!!

CIAO!!  ;)
"The only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle" - Steve Jobs

leo72


se le variabili sono global, sono fissate nella RAM durante tutto il tempo che c'é alimantazione giusto?

Giusto. Tutto il programma le vede e può accedervi e "vivono" finché l'Arduino funziona.

Quote

mentre se vengono dichiarate in funzioni, saranno variabili locali ed il sistema le userà solo mentre servono, uscito dalla funzione le cancellerà o renderà lo spazio occupato da questi dati libero di essere usato in un'altro posto del codice, giusto?

Sì. La memoria liberata da una variabile locale può essere riusata in un altro punto del programma.

Quote

Approposito di limite di scritture della memoria interna (EEPROM in questo caso), ho visto un filmato su youtube di una prova fatta da alcuni ragazzi per collaudare quante riscritture durasse prima di dare errore, hanno creato un loop con contatore, dopo un po di tempo (non ricordo quanto) si è bloccato, facendo qualcosa come 126000 riscritture se non ricordo male!  interessante (quindi da tenere ben a mente quando si fanno dei loop che scrivono in EEPROM ma anche in FLASH, si rischia di rovinare la memoria!).



Atmel dà la EEPROM interna per max 100.000 riscritture, oltre tale valore può darsi che si riesca a scrivere senza errori come no.

MauroTec

L'importante è comprendere che una funzione è un blocco e tutto quello che è un blocco può creare variabili locali terminato il blocco queste variabili terminano di esistere.

Il ciclo for è un blocco, la if è un blocco, il while è un blocco, ma anche {} è un blocco, quindi ad esempio:

loop() {
// sono dentro il blocco loop, quello che creo qui viene distrutto e ricreato ogni volta che la funzione viene rieseguita.

{
//questo è un blocco quello che creo qui è locale e viene distrutto al termine del blocco.
}

}

Creare variabli nella funzione loop comporta un lavoro di stack continuo, quindi non esagerate, anzi non ha senso creare variabili locali qui.
Se per comodità volete dichiarare delle variabili nella funzione loop così da averle a portata di occhio anteponete al tipo la parola chiave
static, in questo modo la variabile è visibile solo all'interno della funzione loop ma questa viene creata una sola volta e quindi il valore contenuto viene
mantenuto proprio come per una variabile globale.

Ciao.
Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up