Quanto tempo impiega la scheda Arduino/Genuino a svolgere i compiti previsti dal software?

Si sa che la scheda Arduino/Genuino Uno ha un oscillatore a 16MHZ. Il dato signfica che le istruzioni vengono eseguite con quella cadenza ma non sappiamo quale sia il "fabbisogno" di impulsi di clock necessari per l'esecuzione di ciascuna istruzione del microcontrollore ATMEL e non sappiamo neanche quali siano le sequenze di istruzioni elementari che devono essere registrate nella memoria del microcontrollore per eseguire le istruzioni previste nello sketch (nota 1).

Quanto impiega Arduino/Genuino ad eseguire una istruzione di commutazione di un pin digitale in uscita?

Con un esperimento si va a vedere cosa accade.

timing schSi monta un circuito di misura che prevede l'uso di un oscilloscopio per osservare la commutazione di un pin digitale (pin D9) e si misurano i tempi che intercorrono fra due commutazioni successive. La commutazione viene imposta dallo sketch.

Lo sketch più semplice (a destra) permette di misurare la rapidità limite con cui viene eseguita un'operazione di output digitale.

timingTest 01b

 

Lo sketch produce una doppia commutazione, per sempre.

Ci si aspetta una commutazione rapidissima, quasi alla velocità del clock il cui periodo è di 62ns, in fondo si tratta di eseguire un solo comando e ripeterlo sempre, e ci si aspetta anche una eguaglianza di durate fra impulso positivo e impulso negativo.

 

 

Risultato:

f1

 

La durata del livello "alto" è di 6,3µs e quella del livello "basso" è di 6,7µs:

- il periodo del ciclo è di 14µs che corrisponde ad una frequenza di circa 71kHz, molto inferiore al periodo di clock;

- le due durate non sono uguali; si può spiegare con il fatto che il passaggio dal livello "basso" al livello "alto" avviene dopo che è stata eseguita l'ultima operazione del ciclo ed il puntatore (Program Counter) deve essere aggiornato per riportarlo al valore di inizio loop.

 

Si introducono nello sketch tre istruzioni di assegnazione di valori a variabil intere (a destra lo sketch)

timingTest 02b

 

 

 

 

f4

 

 

si vede che la durata del livello "alto" resta a 6,3µs mentre quella del livello "basso" è di 7,8µs anzichè 6,7µs: 1,1µs devono essere serviti per le operazioni di assegnazione.

 

Altro fatto che si nota è la presenza di una discontinuità nella ripetizione del loop: ogni 1,03ms un impulso  ha una durata maggiore (in figura sono due valori "bassi" ma può anche darsi il caso che siano uno "basso" ed uno "alto" o entrambi "alto"):

 

 

t01

 

In dettaglio

f3

 

il valore "alto" passa da 6,3µs a 12,5µs.

Ciò che si osserva è una breve sospensione del loop necessaria, forse, per attivare qualche funzione che deve essere eseguita dal microcontrollore per assicurare il funzionamento corretto di Arduino.

 

Sviluppi

Si possono realizzare diverse situazioni per osservare quanto dura una operazione di assegnazione di variabile reale o altre operazioni più complesse come la stampa.

L'esito di questa ricerca può servire a prendere atto che tempi di esecuzione dei calcoli possono non essere così brevi da essere trascurabili di fronte a processi molto rapidi da cui la necessità di utilizzare l'interrupt per processi asincroni ad andamento rapido o a rinunciare, come è il caso in cui si debba prevedere un intervento di emergenza, all'uso di Arduino e prevedere l'uso di hardware specifico.

 

Ecco, per esempio, alcuni articoli che testano il comportamento di Arduino in relazione all'uscita seriale:

- la interazione fra loop e uscita seriale

- la sospensione del loop per consentire l'uscita seriale

- il comportamento della trasmisisone seriale con differenti baud rate.

 

 

 

note

nota 1: lo sketch è scritto in un linguaggio derivato da C++ che deve essere compilato, cioè tradotto nelle istruzioni macchina del microcontrollore; questo comporta la scomposizione di una semplice istruzione come digitalWrite() in una sequenza di più istruzioni in linguaggio macchina che realizzano quest'istruzione di livello più alto e, di conseguenza, l'uso di molti cicli di clock.