Il clock di Arduino batte a 16 MHz, ma con un po’ di attenzione è possibile apportare una notevole ottimizzazione sul nostro codice.
Un paio di settimane or sono mi hanno invitato alla kermesse online Microcon 2020, organizzata da Paolo Aliverti e Pier Aisa. Per l’occasione ho preparato un minicorso relativo alle tecniche di ottimizzazione nella programmazione di Arduino.
Quando si è abituati a lavorare con sistemi in grado di elaborare miliardi di operazioni al secondo e si hanno a disposizione miliardi di byte di memoria, in genere non si pone troppa attenzione all’ottimizzazione fine del proprio programma: in pochi sanno che persino la definizione delle variabili nel codice, o la disposizione dei parametri nella chiamata di una funzione, potrebbero garantirci alcuni nanosecondi di risparmio per ciascun ciclo effettuato. E se 120 nanosecondi vi paion pochi, ricordate che l’intera filosofia di programmazione di Arduino si basa sull’esecuzione di un loop, all’interno del quale vengono costantemente ripetute le istruzioni. Più è veloce l’esecuzione di ciascun loop, maggiore è il numero di operazioni che possiamo portare a termine nell’unità di tempo. O, nello stesso tempo, potremmo eseguire operazioni più complesse. Un esempio su tutti servirà a chiarire le idee.
Lavorare con un GPS
Immaginiamo di avere una scheda Arduino con un ricevitore GPS ed una board per il salvataggio dei dati su microSD. Un programma non ottimizzato opterebbe per un loop all’interno del quale è definito un timer. Il timer legge i valori di posizione di Arduino nell’istante considerato (latitudine e longitudine) e li scrive nella microSD con un timestamp.
L’intera operazione richiede ovviamente un certo tempo. Ora, se siamo in grado di ottimizzzare le nostre operazioni, potremmo tranquillamente utilizzare i cicli di clock risparmiati per esegurie altre interessanti variazioni sul tema, come ad esempio calcolare la velocità istantanea di spostamento (dividendo la distanza tra gli ultimi due punti per il tempo trascorso).
Potremmo anche determinare la velocità media, ottimizzado l’uso della memoria, attraverso una variabile aggiornata ad ogni ciclo.
Se la scheda si trovasse all’inteno di un veicolo, potremmo definire persino l’accelerazione istantanea del mezzo, utilizzando la derivata della velocità rispetto al tempo, o il raggio della curva percorsa, o il tempo di sosta ai semafori…
Sostituendo la microSD ad un sistema di trasmissione WiFi, potremmo infine inviare tutte queste informazioni sul nostro server in cloud senza necessità di ulteriore elaborazione attraverso il back-end.
Con poche decine di euro avremmo risolto il problema della tracciabilità dei mezzi di trasporto di una flotta di veicoli commerciali, o realizzato un sistema di comando e controllo per la disposizione di squadre di azione. Un progetto per la telemetria degli automodelli radiocomandati, da fornire al gestore della pista. Un sistema di geolocalizzaione tascabile.
Tutto questo spettacolare scenario diviene immediatamente possibile nel momento in cui poniamo maggiore attenzione all’utilizzo del nostro codice sorgente. Anche con il piccolo Arduino.
Ottimizzazione del codice
Abbiamo già accennato ai criteri di ottimizzazione del codice in precedenti articoli del blog. Il video che segue li ha raccolti tutti, per fornire un modo rapido ed efficiente per valutare ed implementare le modifiche necessarie al nostro codice. Attraverso tali scorciatoie sarà possibile ottenere aumenti di velocità nei calcoli pari a 10 volte.
Per oggi basta così, abbiamo già messo parecchia carne al fuoco.
La prossima volta vedremo in che modo ottimizzare ulteriormente l’utilizzo della memoria, facendo a meno delle chiamate setup() e loop() caratteristiche di Arduino IDE.
Se avete dubbi o domande non esitate a scriverci!