Pages: 1 [2]   Go Down
Author Topic: Parere in merito al layout del flusso del programma  (Read 1333 times)
0 Members and 1 Guest are viewing this topic.
italy
Offline Offline
Sr. Member
****
Karma: 5
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!).

Logged

"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

italy
Offline Offline
Sr. Member
****
Karma: 5
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!  smiley-wink
Logged

"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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 2793
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Pages: 1 [2]   Go Up
Jump to: