Go Down

Topic: i serial.print nello sketch "che influenza hanno" (Read 2854 times) previous topic - next topic

gingardu

volevo sapere se in uno sketch  es: con molti serial.print   si possono considerare come se non esistessero se la porta usb viene scollegata,
oppure in qualche modo influenzano  le "prestazioni" anche se non c'e nessun usb collegata,
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

L'Arduino utilizza un chip accessorio per comunicare con il PC o comunque via USB (il famoso Atmega8U2 o 16U2 a seconda dei modelli). Questo chip ha un buffer, che il chip svuota comunicando con il computer.
Se spedisci a raffica dati sulla seriale senza che l'Arduino sia connesso al PC, quel buffer si satura e la schedina si pianta. E' la classica situazione in cui si accende la lucina gialla RX fissa e la scheda, se la spedizione avviene fin dall'avvio dello sketch, va "in palla" arrivando a richiedere la famosa manovra d'emergenza per sbloccarla.

Ergo, consiglio di non spedire sulla seriale se non usi la seriale  ;)

paolo_fiorini3

#2
Jun 20, 2012, 08:47 pm Last Edit: Jun 20, 2012, 08:50 pm by paolo_fiorini3 Reason: 1
Sicuramente ti influenzano le prestazioni...ogni istruzione ha un suo tempo di esecuzione quindi il codice sarà piu lento...considerà anche che ogni stringa di cui fai il print occupa spazio in RAM secondo me...

tempo fa avevo visto una cosa del genere:

Code: [Select]
#define DEBUG 1

#if DEBUG
   Serial.println("Debug version");
#endif


EDIT: Vedo che leo e' stato molto piu esaustivo di me :P ...cmq puoi usare quel pezzo di codice che ti ho dato per evitare di commentare tutte le volte i print su seriale...devi modificare solo la variabile DEBUG

gingardu


L'Arduino utilizza un chip accessorio per comunicare con il PC o comunque via USB (il famoso Atmega8U2 o 16U2 a seconda dei modelli). Questo chip ha un buffer, che il chip svuota comunicando con il computer.
Se spedisci a raffica dati sulla seriale senza che l'Arduino sia connesso al PC, quel buffer si satura e la schedina si pianta. E' la classica situazione in cui si accende la lucina gialla RX fissa e la scheda, se la spedizione avviene fin dall'avvio dello sketch, va "in palla" arrivando a richiedere la famosa manovra d'emergenza per sbloccarla.

Ergo, consiglio di non spedire sulla seriale se non usi la seriale  ;)


quindi anche se non è collegata l'usb tenta lo stesso di spedire, buono a sapersi,
allora d'avanti ai serial.print che "non servono nel progetto definivo " mettiamo due // davanti cosi lavorera meglio
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72


quindi anche se non è collegata l'usb tenta lo stesso di spedire, buono a sapersi,
allora d'avanti ai serial.print che "non servono nel progetto definivo " mettiamo due // davanti cosi lavorera meglio

Sì, o commenti le righe, se sono poche, oppure adotti il metodo di Paolo, si tratta di una direttiva al compilatore.

pablos

"che influenza hanno" in termini tecnici .... un botto!! :)  io li uso come debug e sono molto importanti, ma la memoria occupata da queste righe è spaventosa, il rallentamento altrettanto, quando le levo mi torna il sorriso  :D
no comment

gingardu


"che influenza hanno" in termini tecnici .... un botto!! :)  io li uso come debug e sono molto importanti, ma la memoria occupata da queste righe è spaventosa, il rallentamento altrettanto, quando le levo mi torna il sorriso  :D



infatti trovo che siano molto utili per quello  (assieme  a i delay lunghi messi apposta per leggere bene)
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

gingardu


Sicuramente ti influenzano le prestazioni...ogni istruzione ha un suo tempo di esecuzione quindi il codice sarà piu lento...considerà anche che ogni stringa di cui fai il print occupa spazio in RAM secondo me...

tempo fa avevo visto una cosa del genere:

Code: [Select]
#define DEBUG 1

#if DEBUG
   Serial.println("Debug version");
#endif


EDIT: Vedo che leo e' stato molto piu esaustivo di me :P ...cmq puoi usare quel pezzo di codice che ti ho dato per evitare di commentare tutte le volte i print su seriale...devi modificare solo la variabile DEBUG


ma di preciso cosa fa e come si usa il codice che hai postato?
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

Istruisce il compilatore a compilare oppure no determinate porzioni di codice.
Code: [Select]

#define DEBUG 1

#if DEBUG
    Serial.println("Debug version");
#endif

Crei una direttiva in cui dici al compilatore di sostituire tutte le istanze di DEBUG presente nel codice con il valore 1.
Poi dici: "se DEBUG (è vero)" quindi "se 1 (è vero)", compila anche il blocco seguente (fino all'endif). Siccome 1 è vero, viene compilato. Se tu mettevi #define DEBUG 0, tale controllo risultava falso e quel codice non veniva incluso nel tuo sketch.

pablos

si anche se metti DEBUG=0; resta sempre il confronto che rallenta, in compilazione occupano una montagna di memoria delle istruzioni inutili, se non ti servono un bel // risolve :) soprattutto un bel
//serial.begin(9600);
no comment

leo72

#10
Jun 20, 2012, 10:38 pm Last Edit: Jun 20, 2012, 11:00 pm by leo72 Reason: 1
No, scusa. Le direttive servono proprio per non far passare nel compilato finale le porzioni di codice che non interessano. Non stiamo parlando di un if generico ma di un check condizionale per il compilatore.

Se metti:

Code: [Select]
#define DEBUG 1
(....)
if (DEBUG) {
 Serial.Println("a");
}

Questo codice viene compilato e inserito nello sketch finale per cui ad ogni passaggio da quel punto l'Atmega esegue l'if.

Se metti
Code: [Select]
#define DEBUG 1
(....)
#if DEBUG
 Serial.Println("a");
#endif

quel serial.println non viene inserito nello sketch finale SOLO se DEBUG ha valore 0.

pablos

si se hai delle direttive ok ... ma questo pezzo mi sfugge non l'ho capito
Quote

Se metti

#define DEBUG 1
(....)
#if DEBUG
 Serial.Println("a");
#endif

quel serial.println viene inserito nello sketch finale SOLO se DEBUG ha valore 0.

non dovrebbe essere inserito se valore DEBUG = 1?

ciao
no comment

leo72

Sì, scusa ho sbagliato. Volevo scrivere: "non viene inserito... ecc...". Ora correggo.
Stavamo comunque parlando di direttive, quindi se la direttiva è falsa, il codice non viene inserito. Non appesantisce quindi l'esecuzione dello sketch.

pablos

#13
Jun 20, 2012, 11:01 pm Last Edit: Jun 20, 2012, 11:07 pm by pablos Reason: 1
capito thx, comunque che non passassero dal compilato non lo sapevo ... mannaggia le sai tutte!!  :smiley-mr-green: io le levavo e mi toglievo il dubbio  ]:D
no comment

leo72

Non serve solo a questo, ad esempioi puoi inserire nel codice dei dati in base al micro che stai usando o al clock di sistema. Se guardi dentro la mia libreria swRTC vedi un massiccio uso delle direttive perché lì ho dovuto rendere il codice compatibile con una dozzina di micro differenti, ed ogni famiglia di micro ha i suoi registri: un codice unico non andava bene, gli if avrebbero appesantito tutto. In fase di compilazione invece sistemo lo sketch per lo specifico micro su cui poi andrà a girare effettivamente il programma.

Go Up