Progetto interamente sviluppato dentro Void Setup()

Salve Ragazzi, ho sviluppato il mio progetto più complicato su arduino, in particolare ho realizzato un cronometro programmabile che effettua il conto alla rovescia, devo dire che per tempi non troppo lunghi funziona molto bene ed è preciso (non voglio entrare sulla questione precisione clock). A progetto finito pero' vorrei ottimizzare il mio codice per una questione mia di "eleganza" del codice stesso. La prima cosa che mi viene in mente è che ho sviluppato tutto il costrutto all'interno del setup, di volta in volta ho inserito dei cicli while per effettuare le operazioni ripetute, in tutto questo ho lasciato il loop() vuoto. Secondo voi in questo modo comprometto la stabilità del sistema?oppure è solo una "alternativa" nel modo di programmare che può essere tranquillamente adottata? Grazie a tutti in anticipo.

Il setup è una routine che funziona prima di quella di loop e di solito si usa per preparare le porte di I/O e settare eventuali classi come Serial.

Il loop, invece, è ricorsivo, cioè viene ripetuto all'infinito.

Per trasformare il setup in ricorsivo probabilmente hai fatto uso di while oppure dei vituperati goto: hai ragione nel dire che non è molto elegante.

grazie della risposta cyberhs,
sapevo della differenza tra le due funzioni ma ho operato da neofita con il metodo che mi faceva piu comodo.
Effettivamente ho usato molti while ed un paio di goto (che so possano creare instabilità).
Ma io mi chiedevo se questo modo di operare poteva portare altri tipo di problemi alla scheda.
Al di la dell’eleganza del codice, che è comunque relativa, a me il programma funziona bene…

setup(), loop() … sono SOLO delle funzioni richiamate dal main() che l’IDE ti nasconde …

int main(void)
{
	init();
	initVariant();
#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();  // <<<--- qui chiama la funzione setup()
    
	for (;;) {
		loop();  // <<<--- qui, ad ogni giro del for, chiama la funzione loop()

		if (serialEventRun) serialEventRun();
	}
	return 0;
}

… quindi, NON c’è alcun problema salvo che NON puoi usare il metodo SerialEvent della classe Serial dato che il test è effettuato, come ben si vede, dopo ogni chiamata della funzione loop().

Guglielmo

grazie Guglielmo chiarissimo,
ma a questo chiedo a voi che avete più esperienza:

per quanto riguarda la creazione di progetti più complessi e lungo, per il futuro, lavorando all’interno del loop potrei trovare oggettivamente più “agevolazioni” e di conseguenza avere modo di semplificare il codice??oppure resta un modo soggettivo ed indifferente di procedere??
Grazie ancora

Innanzitutto la [u]stabilità[/u] non dipende dall'uso o meno di setup(), loop(), goto (Azz, non scrivevo questa parola da quasi 20 anni!) e quant'altro, quanto piuttosto da come scrivi il codice in generale.

Poi non è nemmeno questione di [u]eleganza[/u]... A quella potrai pensare quando sarai esperto.

È più che altro questione di [u]comodità e mantenibilità[/u]: da come l'hai approcciato tu, sembra che il loop() sia un'inutile complicazione, ma come ti sei reso conto anche tu, di cose che si ripetono ad oltranza ce ne sono in ogni programma, compreso il tuo (per questo hai dovuto usare dei while & Co.), per cui dovrebbe esserti chiaro che il loop() è invece un utile strumento a tua disposizione che, opportunamente utilizzato, semplifica la scrittura dei programmi e li rende più facili da modificare. Vedrai che, con la tua maturazione come programmatore, lo userai con naturalezza ed imparerai a sfruttare a tuo vantaggio ;).

grazie sukko,
in futuro proverò a procedere programmando all’interno del loop, sono convinto che ragionandoci su, mi renderò da solo della differenza.
grazie a tutti

Giusto per completezza dell’informazione.
Chi sa programmare le mcu/micro sul serio, se compatibile con l’hardware e col tipo di applicazione, scrive il codice event driven, ovvero tutto è gestito tramite interrupt e/o scheduler, pertanto il codice diventa una cosa di questo tipo:

setup()
{
 init_programma();
}

loop();

// a seguire le funzioni che gestiscono gli interrupt

init_programma() è una funzione che contiene tutta l’inizializzazione del sistema, sia hardware che software, però possono essere presenti più chiamate a funzioni specializzate e più codice di init dentro la stessa setup, la caratteristica principale di questo modo di scrivere il codice è che la loop, o nel C classico la while(1) o for( ;; ) dentro la main(), sono vuote o comunque contengono poche righe di codice.

Grazie x lo spunto astro... in effetti pEr il mio progettino rieseguo inutilmente troppi refresh dell'lcd e se riesco a schedule le attività senza troppo stravolgere il programma posso complicare ancora un pò :) Lo schedulatore dovrebbe accentratare le chiamate analizzandone la necessità. questo però mi stravolge il programma: per adesso posso gestire delle condizioni che evitano l'esecuzione di routine inutili (es. refresh lcd solo se backlight attivo e limitato ogni .5 secondi)