Spazio memoria Byte Int

Sera!!!
Facendo una prova ho riscontrato questo problema:
Byte dovrebbe occupare 8 bit = 1 Byte in memoria e cioe' essere la variabile che occupa meno.
Ho fatto un test confrontandola con Int ed ho notato che dichiarandole soltando e assegnando un valore la memoria non viene toccata

byte trigger = 2;
int trig = 10;
void setup() {
  
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
}

Sketch uses 444 bytes (1%) of program storage space. Maximum is 30720 bytes.
E' lo stesso output anche se le commento, mentre se le uso all'interno del codice usando un IF occupano lo stesso spazio, sapreste spiegarmi come mai?

byte trigger = 2;
void setup() {
  
  // put your setup code here, to run once:
  //Serial.begin(9600);
}

void loop() {
  if(trigger) Serial.println("Trigger ON");
  else Serial.println("Trigger OFF");
  // put your main code here, to run repeatedly:
}

Nel caso byte sia = 1 -> Sketch uses 1402 bytes (4%) of program storage space. Maximum is 30720 bytes.
Nel caso sia = 0 -> Sketch uses 1404 bytes (4%) of program storage space. Maximum is 30720 bytes.
Potreste spiegarmi questi comportamenti?
Io pensando di ottimizzare un semplice controllo cercando di sprecare meno spazio possibile son stato fregato dal compiler credo :smiley:

Il compilatore è piuttosto intelligente e se tu dichiari variabili inutili che NON usi ... lui le butta ! :smiling_imp:

La seconda parte della tua domanda invece non mi è chiara, spiega meglio ...

Guglielmo

Ah .. se prendi questo programma :

byte pippo = 10;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print(pippo);
}

... puoi assegnare il valore che vuoi a "pippo", ovviamente l'occupazione di memoria NON cambia (ci mancherebbe).

Guglielmo

gpb01:
Ah .. se prendi questo programma :

byte pippo = 10;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print(pippo);
}



... puoi assegnare il valore che vuoi a "pippo", ovviamente l'occupazione di memoria **NON** cambia (*ci mancherebbe*).

Guglielmo

Ho notato pero' che usando un IF se cambio il valore di pippo da 1 a 0 occupa 2 bytes in meno.

Poi un'altra cosa mi e' saltata all'occhio per: quando faccio un ciclo for nel quale al suo interno dichiaro all'inizio una variabile, il programma e' piu' veloce a dichiararla nuova ogni volta o fa prima se la dichiaro static?

for(int i = 0; i <10; i++)
{
   int test = 10;
   ...//Elaboro la variabile modificandole il valore a piacere per poi
   ...//dichiararla nuovamente a 10 ad ogni ciclo
}

Ho letto che usando static la variabile viene dichiarata una sola volta all'interno di quello scope quindi in teoria se uso static davanti la dichiaro a 10 la prima volta e basta, in questo caso dovro' a fine ciclo for dichiararla a 10 in questo caso.
Corretto?

Continui a non cosiderare l'intelligenza del compilatore ... una variabile a zero è sempre falsa e quindi il codice verrà compilato in un certo modo, se diversa da zero è sempre vera e il codice verrà ancora compilato in un altro modo.

Per l'ottimizzazione ti consiglio lo studio del documento allegato ...

Guglielmo

Atmel - Efficient C Coding for AVR.pdf (140 KB)

gpb01:
Continui a non cosiderare l'intelligenza del compilatore ... una variabile a zero è sempre falsa e quindi il codice verrà compilato in un certo modo, se diversa da zero è sempre vera e il codice verrà ancora compilato in un altro modo.

Per l'ottimizzazione ti consiglio lo studio del documento allegato ...

Guglielmo

Dopo mangiato lo leggo volentieri :smiley:
Perfetto grazie!!!!!

Ho appena scoperto l'EEPROM in Arduino... Mi ha aperto un mondo!!!!!

Triko93:
Ho appena scoperto l'EEPROM in Arduino... Mi ha aperto un mondo!!!!!

Allora ti aggiungo questi ... buono studio !!!

Guglielmo

EEPROM.pdf (181 KB)

AVR101 - High Endurance EEPROM Storage.pdf (47.3 KB)

Atmel - High Endurance EEPROM Storage.c (4.31 KB)

gpb01:
Continui a non cosiderare l'intelligenza del compilatore ... una variabile a zero è sempre falsa e quindi il codice verrà compilato in un certo modo, se diversa da zero è sempre vera e il codice verrà ancora compilato in un altro modo.

Per l'ottimizzazione ti consiglio lo studio del documento allegato ...

Guglielmo

Devo dire che qui si scende nel minimo dettaglio, lettura difficile da studiare e capire!!
Pian piano lo leggo tutto. Agli altri allegati do un occhio domani mentre sono in treno! :smiley:

Purtroppo per usare il Microcontroller e la sua programmazione bene devi conoscere i particolari sia hardware che software (tra cui anche le particolaritá del compilatore).
Ciao Uwe

Non vorrei che le dispense proposte scoraggino o spaventino l'utente :slight_smile: Ho letto dalla presentazione che è diplomato in informatica ma forse non è abituato alla programmazione a basso livello !?
Non preoccuparti molti utenti sono nella stessa situazione ma comunque riescono ad usare la eeprom :slight_smile:

Arduino è nato per semplificare la programmazione e l'utilizzo di un microcontrollore, una sorta di astrazione dalla programmazione a basso livello e dalla conoscenza dell'hardware. Quindi si può fare molto non conoscendo approfonditamente la programmazione a basso livello.
Puoi usare la eeprom in modo molto semplice se guardi gli esempi proposti della libreria.

Se si vuole fruttare ai massimi livelli arduino occorre scendere più profondamente! Ma è da dire che le persone che affrontano la programmazione a basso livello, per la maggior parte dei casi, non lo hanno imparato entrando nel mondo di arduino ma era un bagaglio di conoscenze che già possedevano, o programmatori professionisti o elettronici che hanno lavorato con microcontrollori.

torn24:
Non vorrei che le dispense proposte scoraggino o spaventino l'utente :slight_smile: Ho letto dalla presentazione che è diplomato in informatica ma forse non è abituato alla programmazione a basso livello !?
Non preoccuparti molti utenti sono nella stessa situazione ma comunque riescono ad usare la eeprom :slight_smile:

Arduino è nato per semplificare la programmazione e l'utilizzo di un microcontrollore, una sorta di astrazione dalla programmazione a basso livello e dalla conoscenza dell'hardware. Quindi si può fare molto non conoscendo approfonditamente la programmazione a basso livello.
Puoi usare la eeprom in modo molto semplice se guardi gli esempi proposti della libreria.

Se si vuole fruttare ai massimi livelli arduino occorre scendere più profondamente! Ma è da dire che le persone che affrontano la programmazione a basso livello, per la maggior parte dei casi, non lo hanno imparato entrando nel mondo di arduino ma era un bagaglio di conoscenze che già possedevano, o programmatori professionisti o elettronici che hanno lavorato con microcontrollori.

Non scoraggiano No!
Comunque ho già provato ad usare la eeprom e funziona bene bene e capisco abbastanza di quel che leggo :smiley:
A scuola si usava Java e poi....php....
Poco C che ho studiato più per conto mio

A scuola si usava Java e poi....php....
Poco C che ho studiato più per conto mio

Java e php, immaginavo :slight_smile: Ti insegnano strumenti che ti possano essere utili, java per uso generale e php per lato server, ma hanno poco a che vedere con la programmazione a basso livello.

Devi sapere che chi è esperto nella programmazione di microcontrollori ha avuto esperienza con la programmazione in assembly! E per alcuni programmare un microcontrollore in linguaggio C significa
"rendere facile le cose" :slight_smile:

Comunque se vuoi approfondire non ti farà male, però leggendo qualche tuo post mi sembra che salti degli step, prima imparare bene gli strumenti "semplificati" che mette a disposizione arduino, e poi se uno sente la necessità approfondire. Leggendo qualche tuo post mi sembra che ancora non utilizzi nel migliore dei modi gli strumenti standard "semplificati" di arduino.

Premetto che non sono capace di programmare a basso livello, ma la programmazione facilitata di arduino soddisfa tutte le mie esigenze :slight_smile: :slight_smile:

torn24:
Java e php, immaginavo :slight_smile: Ti insegnano strumenti che ti possano essere utili, java per uso generale e php per lato server, ma hanno poco a che vedere con la programmazione a basso livello.

Devi sapere che chi è esperto nella programmazione di microcontrollori ha avuto esperienza con la programmazione in assembly! E per alcuni programmare un microcontrollore in linguaggio C significa
"rendere facile le cose" :slight_smile:

Comunque se vuoi approfondire non ti farà male, però leggendo qualche tuo post mi sembra che salti degli step, prima imparare bene gli strumenti "semplificati" che mette a disposizione arduino, e poi se uno sente la necessità approfondire. Leggendo qualche tuo post mi sembra che ancora non utilizzi nel migliore dei modi gli strumenti standard "semplificati" di arduino.

Premetto che non sono capace di programmare a basso livello, ma la programmazione facilitata di arduino soddisfa tutte le mie esigenze :slight_smile: :slight_smile:

Certo perché non ho mai utilizzato in modo serio il tutto!
Cosa intendi con strumenti semplificati?
Comunqie anche io ho fatto assembly per un mese ed avevo imparato solo a SOMMARE 2 numeri ah ah. Era super tosto!

Cosa intendi con strumenti semplificati?

La programmazione in linguaggio C di un microcontrollore è differente dalla programmazione in C delle schede arduino. Se provassi a dare un occhiata in rete ad esempio della programmazione in C dei PicMicro, ti accorgeresti che anche per fare lampeggiare un led occorrerebbe operare su registri del mcu.

L'ambiente arduino ad esempio utilizza la funzione loop(), in un normale microcontrollore bisogna crearsi un ciclo infinito, sempre l'ambiente arduino mette a disposizione funzioni e costanti per agire sui pin digitali, in un controllore bisogna agire su registri o nomi memonici, arduino mette a disposizione funzioni per usare molto semplicemente un ingresso analogico, non è altrettanto semplice in un normale microcontrollore ecc...

L'ambiente arduino come detto rende più facile le cose, programmare in C un microcontrollore non è altrettanto facile di come programmare in C arduino.... Per cui sono strumenti semplificati :slight_smile: :wink:

torn24:
La programmazione in linguaggio C di un microcontrollore è differente dalla programmazione in C delle schede arduino ...

Concordo al 100%

Guglielmo

P.S.: ... sono un "authorized Microchip™ design partner" :grin:[/i]

Chiarissimo! Mette a disposizione delle chiamate a basso livello molto piu' semplici da usare :smiley: