Netduino 2–GPIO Speed

Netduino ofrece una plataforma de desarrollo en sistemas embebidos sin OS. Utiliza en su lugar una capa HAL y un runtime de .NET Micro Framework.

La idea de este post es volcar algunas pruebas realizadas sobre las capacidades real-time, jitter, tiempos de respuesta, etc.

Para esto dispongo de un osciloscopio digital de 25Mhz conectado a un par de salidas de la placa.

P1010786

GPIO Speed

La intención de esta prueba es alcanzar la máxima velocidad de alternancia en una salida. Alternando los valores HIGH/LOW sobre un solo PIN de la GPIO. el codigo utilizado es el siguiente:

public static void Main()
{
OutputPort pd1 = new OutputPort(Pins.GPIO_PIN_D1, false);

for (; ; )
{
pd1.Write(true);
pd1.Write(false);
}
}

No hay Sleep, y no hay carga de procesamiento de ningún tipo, solo cambia el estado de la salida del pin digital 1.

Como podemos ver en el osciloscopio el pulso generado tiene una duración de 12 us. Lo extraño es la duración del pulso en baja que es de 14.4 us, pero estimo que esos 2.2 us extras se deben al control de flujo de la función for (;;). Con lo cual puedo deducir que un loop en .NETMF tiene un overhead de 2.2us por ciclo.

P1010787

P1010788

Para resumir el overhead del managed code de C# de la instruccion pin.Write(…) tiene aproxidamente 12 us. Y la frecuencia maxima que se puede alcanzar es de 40 kHz.

 

GPIO Speed con 2 Pins

La idea de esta prueba es calcular el tiempo que requiere cambiar un pin de estado  y luego el siguiente. El codigo utilizado es el siguiente:

public static void Main()
{
OutputPort pd1 = new OutputPort(Pins.GPIO_PIN_D1, false);
OutputPort pd2 = new OutputPort(Pins.GPIO_PIN_D2, false);

for (; ; )
{
pd1.Write(true);
pd2.Write(true);
Thread.Sleep(1);
pd1.Write(false);
pd2.Write(false);
Thread.Sleep(1);
}
}

El Thread.Sleep es solo para espaciar el pulso, lo importante en realidad es el delta entre

pd1.Write(false);
pd2.Write(false);

Como se ve en la imagen del osciloscopio tenemos una diferencia de 12us.

P1010790

Jitter

Por lo pronto no esperaba que este fuese un problema, sobre todo teniendo en cuenta que aquí no hay un OS, solo un runtime con HAL. Los resultados de las pruebas dejan claro que no hay problemas de jitter. Los pulsos son estables, su duración es constante.

Pero, en algunos momentos, muy esporadicamente pude observar que la placa comienza a introducir algo de jitter, no puedo entender el motivo pero luego de correr durante 15 o 20 minutos comienzo a ver un jitter de 2 us.

El código de prueba no crea variables ni nada que requiera de GC. Por lo pronto no logro explicar el origen del jitter. Pero tengamos en cuenta que es muy muy bajo discreto y acotado entre 0 y 2 us siempre. Es muy raro.

Algo interesante de observar es que luego de reseteada la placa, durante los primeros segundos se observa algo de jitter, aparentemente alguna tarea del bootloader residual.

En pruebas posteriores observe el mismo fenómeno, ahora con 3us de jitter.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s