Testare la velocità di commutazione di un pin digitale

Una delle domande che mi pongo quando lavoro con un dispositivo programmabile è quanto questo sia veloce. Non so se esistano procedure specifiche che indichino la potenza di calcolo effettiva, indicativamente il test che eseguo io è quello di commutare di continuo un’uscita digitale e verificare con un oscilloscopio il tempo della durata di una istruzione.
Il codice è il seguente:

//Netduino GPIO
OutputPort Test = new OutputPort(Pins.GPIO_PIN_D0, false);

while(true)
{
Test.Write(true);
Test.Write(false);
 }

 

Questo codice generare un onda quadra con una frequenza di circa 8.4 KHz; Il segnale positivo generato dalla Write(true) dura circa 53us mentre il segnale negativo dovuto alla funzione Write(false)dura circa 64us. Verosimilmente il segnale negativo dura qualche microsecondo in più poiché il processore deve eseguire anche l’istruzione While(true). Quindi l’istruzione While viene eseguita in circa 11us (64us – 53us)

Netduino GPIO

Segnale PWM 50 per centoPer verificare la correttezza di queste misure ho modificato il codice aggiungendo un’altra istruzione Write(false) per verificare che l’impulso negativo fosse di circa 117us (53us + 53us + 11us)

OutputPort Test = new OutputPort(Pins.GPIO_PIN_D0, false);

while(true)
{
Test.Write(true); //Questa istruzione dura 53us
Test.Write(false); //Questa istruzione dura 53us
Test.Write(false); //Questa istruzione dura 53us
 }

 

La misura con l’oscilloscopio è per l’impulso positivo di circa 53us (istruzione Write(true)) e di circa 117us per l’impulso negativo (53us più 64us, due istruzioni Write(false) e istruzione while(true)).

Netduino GPIO test speed

Queste prove sono state eseguite compilando in modalità Debug, mentre utilizzando la modalità Release i tempi migliorano grazie all’ottimizzazione del codice. Per l’impulso negativo abbiamo circa 53us e per l’impulso positivo abbiamo circa 52us. Quindi le istruzioni write() durano circa 52us mentre l’istruzione while(true) dura circa 1us.

Ogni istruzione impiega un certo tempo per essere eseguita; questo tempo dipende esclusivamente dalla potenza di calcolo del processore Atmel del Netduino. Non abbiamo quindi un controllo diretto sul tempo di esecuzione del programma, sappiamo che ogni istruzione impiega un certo tempo; per migliorare le prestazioni dei nostri programmi dobbiamo imparare a scrivere le istruzioni in modo che impieghino il minor tempo possibile.

In definitiva il Netduino non è velocissimo come un ad esempio un PicMicro; questo dipende sicuramente dal fatto che  il microprocessore Atmel deve far girare il .Net micro framework.
Certamente questo piccola perdita di prestazioni è trascurabile rispetto ai vantaggi nell’utilizzare un ambiente gestito dal .Net micro framework, che semplifica la creazione dei programmi e la gestione dell’hardware.