SOFTWARE - F(), uint_16/8, volatile ecc...

Apro questo topic nella speranza di trovare qualcuno molto paziente. Spesso, utilizzando codice trovat su internet, mi imbatto in forme sintattiche che non sono ma riuscito a comprendere. Se qualcuno potesse essere così gentile da spiegarmele bene, sarei molto grato. In particolare ora me ne vengono in mente alcune:

  • F(): Spesso ho trovato questa forma: println(F("Initializing I2C devices...")), e mi sono chiesto: cosa serve la funzione F() e cosa comporta il non usarla affatto? (println("Initializing I2C devices...")
  • A volte trovo delle variabili dichiarate come uint_16, uint_8. Cosa significano esattamente, come si differenziano dalle normali int? Possono esistere anche uint_64 e così via?
  • A volte capita di trovare volatile prima della dichiarazione di una variabile. Cosa serve?
  • Questa sintassi strana mi ha confuso: while (!Serial.available()); . Che effetto ha?

Grazie mille in anticipo!

Ciao la funzione F() (Spiegazione del reference QUI ) serve a istruire il compilatore a memorizzare il contenuto non nella preziosissima e di dimensioni molto contenute ma bensì nella più capiente memoria flash. la differenza principale tra uint_16 e un int normale è che nel primo modo definisci un intero senza segno che può quindi ospitare un range di valori solo positivi ma doppio rispetto ad un int normale, per approfondire guarda il reference qui se vuoi utilizzare le istruzioni native di arduino puoi definire un int come senza segno utilizzando unisigned int La direttiva di compilazione volatile (Spiegazione del reference qui ) serve a istruire il compilatore a memorizzare il contenuto della variabile in una cella della RAM e non nel registro standard dove vengono memorizzate le variabili, questo per quanto riguarda arduino serve unicamnete per le variabili modificate all'interno delle funzioni lanciate dagli interrupt il costrutto while (!Serial.available()); lo puoi scrivere in modo più chiaro in questo modo

while (!Serial.available()){
}

Semplicemente si resta bloccati nel while finché non vi è un dato disponibile nel buffer seriale.

@Yaxit:

Direi che devi studiare un po' qualche buon testo di C ... ...puoi cominciare con QUESTO e puoi scaricarti QUESTO libro (... tranquillo, è un sito legale, purché per [u]esclusivo[/u] uso PERSONALE).

Vedrai che dopo tutto ti sarà più chiaro ... ;)

Guglielmo

Grazie, chiarissime spiegazioni. Ringrazio anche per le letture, le ho scaricate e le leggerò appena avrò tempo. Se ho capito bene quindi "volatile" serve per leggere il valore della variabile da una fonte più sicura, nel caso venga modificata in modi non canonici, è così? E suppongo dunque che uint_8 utilizzi solo 8 bit, supportando solo 256 valori (positivi). Esistono anche uint_64? Comunque adesso leggo bene le guide, grazie mille!

Yaxit:
E suppongo dunque che uint_8 utilizzi solo 8 bit, supportando solo 256 valori (positivi). Esistono anche uint_64?
Comunque adesso leggo bene le guide, grazie mille!

Prova a dare un occhiata QUI e, NO gli ATmega (come il ATmega328P usato su Arduino UNO) sono delle piccole MCU a 8 bit ed il tipo di dato massimo che gestiscono è quello a 32 bit.

Diverso è il caso di altre MCU (es. ARM) che possono gestire anche tipi a 64 bit (ed oltre).

Guglielmo