conservare valore variabile

E' possibile in Arduino definire in qualche modo una variabile all'interno di una funzione tale per cui se esco e rientro nella funzione il valore non viene perduto, senza usare le var. globali? Giorgio

Ho trovato basta usare lo "static", Giorgio

definendola static, ma qual'è la ragione di far ciò invece che usareuna globale? Alla fine lo spazio in memoria usato dalla variabile sarebbe il medesimo. Se non vuoi una globale allora un'altra possibilità è quella di passarla come parametro alla funzione per riferimento

Trovavo la cosa piu’ ordinata e piu’ visibile a chi cerca la variabile, niente cmq di grossa importanza. Giorgio

padoang: Trovavo la cosa piu' ordinata e piu' visibile a chi cerca la variabile, niente cmq di grossa importanza. Giorgio

Concordo sull'ordine e sulla visibilità (intesa come facilità di manutenzione, non come scope) magari, visto che AVR consiglia quando possibile di usare variabili locali, è anche più veloce, ma qui ci puo' aiutare Guglielmo

In ambito AVR è, per quanto possibile, sempre meglio l'utilizzo di una variabile "locale" dato che, per quanto possibile, per essa vengono usati registri liberi e NON la SRAM (dove invece vengono messe le "globali").

Considerate una banale sottrazione: "a -= 10;" dove 'a' è un byte;

se 'a' è dichiarata globale le dimensioni del codice sono di 10 bytes:

LDS  R16, LWRD(a)
SUBI R16, LOW(10)
STS  (a), R16

se 'a' è dichiarata locale, stando già in un registro, le dimensioni del codice diventano di 2 bytes:

SUBI R16, LOW(10)

... con conseguente risparmio di flash e velocità di esecuzione.

Le variabili dichiarate "localmente" static vengono tenute in SRAM, se possibile copiate in registri al momento dell'entrata nella funzione e ridepositate in SRAM all'uscita, quindi ... in dipendenza dell'uso, possono essere comunque più veloci (se usate più di una volta all'interno della funzione).

Guglielmo

... per limitare l'uso di "globali", Atmel suggersice, in caso di una massimo di un paio di parametri di tipo semplice (char, int, long, float, double), di usare funzioni a cui questi due parametri vengono passati e la funzione restituisce un valore di ritorno. In tale caso vengo usati i registri di lavoro da R16 a R23 e NON altro tipo di memoria.

Se invece è necessario passare più di due parametri per ottenere lo scopo, o parametri complessi (es. strutture), occorre considerare che questi vengono messi nello STACK o passati come puntatori comunque a zone di SRAM.

Guglielmo

Come spesso avviene si ottiene molta conoscenza in più. Sono d'accordo con tutto se la variabile viene usata solo in quello scope, allora si che il codice è ordinato e performante. Se poi si cede all'uso della variabile static in giro per il mondo delle funzioni allora preferisco comunque la globale per chiarezza di codice.

fabpolli: Sono d'accordo con tutto se la variabile viene usata solo in quello scope

se è locale è usata solo in quello scope...

Standardoil:
se è locale è usata solo in quello scope…

Per me è chiarissimo, come anche per te e per chi ha dimestichezza con il C, chi invece è agli inizi potrebbe anche farne un “cattivo” uso, da li il mio commento tutto qui.

Ah, ok