Newsgroup: it.hobby.elettronica.digitale
Titolo: variabili static all'interno delle funzioni

Situazione: micro renesas H8 3672, firmware scritto in C e compilato con IAR 
iich8
Ho notato che se all'interno di una funzione dichiaro delle variabili 
static,
l'esecuzione della funzione impiega un certo tempo ..
che diminuisce MOLTO se le variabili invece che all'interno della funzione,
le dichiaro globali. Purtroppo però in questo modo occupo piu Flash-ROM.
Cosa accade di preciso a livello hardware nel micro nei due casi?
E' possibile che con micro PIC abbia comportamenti diversi ?
grazie 


Premetto che non conosco quel micro, in genere pero' le variabili
statiche (interne a una funzione o globali) sono allocate in un preciso
indirizzo di RAM che resta fisso per tutta la durata del programma,
ossia, nel caso del firmware di un micro, per sempre.
Invece le variabili dichiarate all'interno di funzioni per default sono
auto e sono allocate in uno spazio temporaneo nello stack che viene
poi liberato all'uscita della funzione.
La differenza e' che nel primo caso il programma accede alla variabile
direttamente tramite il suo indirizzo mentre nel secondo caso accede
tramite un puntatore indicizzato e in genere richiede piu' operazioni
della CPU.
Nel tuo caso mi sembra strano che ci sia differenza tra variabili
static e globali. Per capire il motivo prova a guardare il listato asm
prodotto dal compilatore o il codice disassemblato.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 poi liberato all'uscita della funzione.
Secondo me il problema potrebbe essere questo ..
lo stack viene usato per "ricreare" le variabili ogni volta che eseguo la 
funzone, ma essendo variabili static, immagino che faccia un'operazione di 
copia del valore precedente sullo stack, poi una volta termonata la funzione 
salva il valore raggiunto dalla variabile static e distrugge lo spazio 
allocato nello stack. Tutte queste operazioni impiegheranno del tempo!
non so se siano operazioni che vedo nel codice ASM perchè non vorrei fossero 
gestite in modo trasparente direttamente in HW ...
La soluzione migliore è a sto punto metterle come variabili globali, 
sennonchè mi vanno ad occupare tantissima flash eprom .. 

 le dichiaro globali. Purtroppo però in questo modo occupo piu Flash-ROM.
Non c'è differenza tra dichiarare una variabile globale o statica 
all'interno della funzione, per il compilatore è la stessa cosa, e 
sono allocate entrambe in RAM (non in flash).
Quest'ultimo discorso mi fa capire che forse c'è qualcosa che dai per 
scontato in cui risiede il problema, per scoprire cos'è dovresti 
compilare il sorgente in entrambi i modi e controllare l'assembly 
generato.
Ciao

 sennonchè mi vanno ad occupare tantissima flash eprom .. 
Come già detto nel mio altro post, dichiararle statiche in una 
funzione o globali è la stessa cosa; non ti occupano flash in più, e 
se invece te la occupano ci deve essere qualcos'altro, puoi postare il 
codice, così capiamo meglio?
Ciao

 il sorgente in entrambi i modi e controllare l'assembly generato.
infatti .. il mio unico timore è che siano operazioni che il micro esegue in 
HW in modo non visibile nemmeno da assembly..
appena torno al lavoro verifico! 

 HW in modo non visibile nemmeno da assembly..
Queste cose sono visibili, altrimenti come mai in un caso viene 
occupata più flash? Inoltre non ho mai sentito di processori che 
eseguono istruzioni di nascosto :-)
Vai tranquillo, dall'assembly capirai tutto.
Ciao

 allocate entrambe in RAM (non in flash).
Ciao Francesco,
mi sono sempre chiesto se l'utilizzo di variabili statiche fosse solo 
una questione di leggibilità del codice. Dalla tua risposta mi sembra 
che confermi questa cosa, oppure approfondendo la questione emergono 
differenze?
Marco / iw2nzm

differenze?
Le variabili #STATIC vanno del Data Space in ram e restano li per tutta
l'esecuzione del programma, mentre le altre vengono passate tramite lo Stack,
che sfrutta un altra zona di ram.
Proprio per questo l'uso di variabili #STATIC se fatto in maniera oculata può
velocizzare il programma perchè non si devono costruire e distruggere variabili,
risparmiando tempo.
--
ciao
  Stefano

 che sfrutta un altra zona di ram.
Anche le globali passano tramite stack? Io mi riferivo alle statiche e 
globali.
Ciao!
Marco / iw2nzm

SB ha scritto:

Le variabili globali usano il Data segment e non lo Stack segment, poi magari
dipende dai compilatori, ma ad esempio in VB è così perchè lì ho verificato con
SoftIce direttamente in ram.
--
ciao
  Stefano

 differenze?
Sono la stessa cosa, le differenze sono solo di leggibilità e di scope.
Una variabile statica dichiarata all'interno di una funzione non è 
visibile al di fuori di essa e questo può essere  molto utile per 
implementare l'information hiding, molto utile per evitare bug e 
aumentare la manutenibilità del codice.
Ciao

 risparmiando tempo.
Questo non č poi tanto vero, creare una varibile automatica nello 
stack richiede appunto di lasciare un po' piů in di spazio vuoto alla 
creazione dello stack frame. E siccome lo stack frame viene creato 
comunque (per pusharci i registri ed altre cose) spostare lo stack 
pointer di 30 o di 31 byte non fa differenza nel tempo di esecuzione.
Casomai le differenza possono esserci nel tempo di accesso, perché 
effettuato in modo indiretto con offset, ma anche qui dipende molto 
dall'architettura del processore e da come sono allocate le variabili 
statiche dal compilatore.
Ammesso quindi di aver davvero bisogno di ottimizzare in questo senso, 
consiglierei questa strada solo dopo aver valutato molto molto, molto 
bene i pro e i contro, evitando di effettuare ottimizzazioni preventive.
Ciao

 le dichiaro globali. Purtroppo però in questo modo occupo piu Flash-ROM.
Occupi più flash ? non credo proprio....ci dev'essere qualcosa che non 
torna, visto che una variabile in RAM, che sia globale o automatica statica 
è sempre una variabile in RAM!
Non è che per caso non è una variabile vera e propria ma una costante?
Ciao
CG