Info su F()

Salve!
Sto usando quella funzione di Arduino per risparmiare Ram… ma mi chiedevo: è vero che diminuisce la precisione? So che si possono mettere nella flash solo i testi e non le variabili… però ad esempio, se ho una cosa così, cosa si può mettere nella flash senza problemi?

client.print ("<font face=Arial>");
            client.print ("<font size=5>");
            client.print ("<font color=#00FF00>");
            client.print( "Temperatura esterna");
            client.print ("&deg");
            client.println ("C");
             client.print ("</font>");
            client.println("
");

Ho la ram di Arduino Mega occupata fino al 56%… dite che dovrei tenermi sotto 50? La flash invece è al 34%

Ciao!

Non diminuisce nessuna precisione, solo non è supportata da tutte le funzioni (per farla semplice). Nel tuo caso puoi usarla tranquillamente (con le varie print() è sempre OK), ma 56% di RAM utilizzata non dovrebbe dare alcun problema.

SukkoPera:
Non diminuisce nessuna precisione, solo non è supportata da tutte le funzioni (per farla semplice). Nel tuo caso puoi usarla tranquillamente (con le varie print() è sempre OK), ma 56% di RAM utilizzata non dovrebbe dare alcun problema.

Grazie per la risposta Sukko. Quindi anche per le client.print che ho postato non dovrei avere problemi… bene, perché quelle mi fanno risparmiare almeno un altro 10% di Ram… Diciamo che preferisco stare sotto il 50 perché avendo l’ethernet shield e sapendo che ci sono vari problemi riguardo al suo funzionamento sul lungo andare e siccome io devo tenere arduino acceso SEMPRE, voglio restare sotto il 50, almeno so che non può essere di sicuro qualche problema se si bloccasse arduino causati dalla Ram troppo occupata…

Anche in questa richiesta HTTP si può usare la F?

 client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 10");  // refresh the page automatically every 6 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
           client.println();

Si, nelle print() e prinln(), purché si tratti di "costanti" (come le stringhe fisse del tuo caso), puoi sempre usare la macro F() :)

Guglielmo

Grazie Gugliemo :) Meglio così, posso mettere a dieta il codice allora, adesso glielo dico :) Ciao!

Sono passato dal 58% (no 56%) al 25%, la macro F è una manna dal cielo se usi moltissimi print. Avevo tantissimi client print/ln che ho spostato nella flash... Grazie ancora! Ciao!

Ullalà..... mi date qualche dettaglio o un link dove studiare sta cosa? Il mio nano è oltre il 60% sia di flash che ram.... magari qualcosa in + in flash mi fa stare + tranquillo....

Grazieeeeee

Puoi leggere QUI e qualche cosa di più QUI :wink:

Se poi vuoi approfondire, vai nei sorgenti del “core”, file “WString.h” e trovi …

class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

… e tutto quello che ne segue :slight_smile:

Guglielmo

Quella del Wstring non la conoscevo :) Cosa sarebbe ? Ciao!

As_Needed: Quella del Wstring non la conoscevo :) Cosa sarebbe ?

Dove pensi siano tutte le funzioni che Arduino IDE ti mette a disposizione? Pensi veramente che usando altri strumenti di sviluppo (es. Atmel Studio) avresti, ad esempio, funzioni come pinMode(), digitalRead() ecc. ecc. ?

NO, tutto questo è un insieme di moduli, scritti dal team Arduino, che prende il nome di "core" e che è stato uno dei motivi principali della diffusione di Arduino dato che ... nasconde tutta la complessità che c'è nel programmare un microcontrollore.

WString.h è uno dei moduli del "core" che, appunto, trovi all'interno dell'IDE :)

Guglielmo

gpb01: Dove pensi siano tutte le funzioni che Arduino IDE ti mette a disposizione? Pensi veramente che usando altri strumenti di sviluppo (es. Atmel Studio) avresti, ad esempio, funzioni come pinMode(), digitalRead() ecc. ecc. ?

NO, tutto questo è un insieme di moduli, scritti dal team Arduino, che prende il nome di "core" e che è stato uno dei motivi principali della diffusione di Arduino dato che ... nasconde tutta la complessità che c'è nel programmare un microcontrollore.

WString.h è uno dei moduli del "core" che, appunto, trovi all'interno dell'IDE :)

Guglielmo

No no so che c'è un grande lavoro dietro :) Ad esempio anche nelle stesse librerie di un sensore come il ds18b20, c'è tutto un codice dietro che fa sì che con "sensor.begin" si inizializzi il sensore. A come ho capito, da quella "F" si nasconde tutto quello che c'è su Wstring.h, giusto? Ciao!

As_Needed:
A come ho capito, da quella “F” si nasconde tutto quello che c’è su Wstring.h, giusto?

No, la macro F() è definita in WString.h … ma dentro a WString.h c’è … moooooooooolto di più … te la metto in allegato … così ci dai una sbirciatina … :wink:

Guglielmo

WString.h (9.48 KB)

gpb01:
No, la macro F() è definita in WString.h … ma dentro a WString.h c’è … moooooooooolto di più … te la metto in allegato … così ci dai una sbirciatina … :wink:

Guglielmo

Che roba, l’avevo già trovata comunque da solo ma grazie per il download :wink: Comunque a sua volta richiama altre librerie! E quanta roba c’è :smiley: E noi “umani” che scriviamo solo F :slight_smile: che poi è solo una delle tante cose definita in WString.h a come dici.
Ciao! :slight_smile:

gpb01: Puoi leggere QUI e qualche cosa di più QUI ;)

Se poi vuoi approfondire, vai nei sorgenti del "core"

... e tutto quello che ne segue :)

Guglielmo

Oh per adesso no che sono senza aspirine :)

Grazie!!