Arduino unit testing
Abbiamo già introdotto alcune tecnologie accessorie intorno al C++ e ad Arduino. Tra le evoluzioni più interessanti di cui vogliamo parlare oggi, c'è ne sono alcune che potremo sfruttare per Arduino, ed altre che sono meri spunti di riflessione. Andiamo ad iniziare!
Prima di partire
Se, come il sottoscritto, non usate il C++ da parecchio tempo, è bene sapere che il linguaggio è evoluto. Vi suggeriamo quindi alcuni riferimenti notevoli:
- Il sito web di Stroustrup, il creatore del linguaggio
- Questo breve tutorial sui template, la cui sintassi si è evoluta nel tempo.
- Una puntatina sui namespaces, tanto cari a linguaggi come Python, Perl, Java, Ruby
Spunti di Riflessione
I Template del C++ possono essere usati per organizzare una meta-programmazione in stile funzionale. Purtroppo la sintassi risultante è un tripudio di simboli < e >, ed è quasi illeggibile. Tra le applicazioni immediate, vi è la posibilità di creare alberi di ricerca bilanciati su dati statici, altrimenti detti compile-time binary search trees.
Se vi trovate a vostro agio con l'argomento, potete dare un occhio a questo metaprogramming framework, che però ci sembra troppo grande per il piccolo Arduino Uno con soli 32Kb di spazio per il codice :)
Strumenti ed idee
Ecco un elenco di strumenti e approcci che ci sono stati molto utili durante il design dei nostri progetti Arduino.
CxxUnit
Vi suggeriamo di imitare la strutturazione della libreria Aiko, che viene fornita con un makefile in grado di effettuare test di non regressione senza l'ausilio dell'arduino IDE. E' sufficente avere il gcc e python (o perl). Aiko sfrutta una libreria chiamata CxxTest. L'effeto è duplice: il codice viene strutturato in modo modulare, senza dipendere dalle API specifiche di Arduino, e risulta più corretto dal punto di vista formale, con la dichiarazione dei prototipi delle relative funzioni.
L'idea geniale di Aiko è di aver creato dei piccoli mokup ("stubs") che consentono di compilare includendo delle versioni "finte" dei file di inclusioni dell'arduino ide:
Vi suggeriamo di "rubare" dal progetto Aiko gli stubs e di estenderli secondo le vostre necessità. Se CxxTest non vi piace c'è anche CppTest
Stack Usage
Abbiamo detto in un precedente articolo che il C++ non ha un gestore di memoria. In realtà lo stack può essere visto come un sistema di gestione automatica della memoria. E' possibile quindi servirsene in modo molto aggressivo, strutturando il programma a funzioni chiuse ed isolate.
Ecco un esempio:
[cpp]typedef enum StatusLedsPinEnum { led1=2, led2=3, led3=4, led4=5, led5=6, LastLed=led5 }; ... void knightRider(){ static StatusLedsPinEnum currentLedPosition = led1; static StatusLedsPinEnum prevcurrentLedPosition = led5; // Turn on it digitalWrite(currentLedPosition,HIGH); // Turn off the last digitalWrite( prevcurrentLedPosition,LOW);
prevcurrentLedPosition = nextLedPosition(prevcurrentLedPosition); currentLedPosition = nextLedPosition(currentLedPosition); } [/cpp]
Questa funzione si serve di variabili static private (quindi visibili solo a lei) e di una tipizzazione molto forte, per creare una callback che accenda alternativamente alcuni led.
E con questo abbiamo concluso questa rapida serie di suggerimenti architetturali per Arduino!
Altri Riferimenti