viernes, 14 de agosto de 2015

Arduino Mega 2560 - Test de velocidad

Resumen
En esta entrada vamos a comparar la velocidad de salida de una línea discreta del Arduino Mega 2560 usando el código de Arduino frente a la programación directa por registros.

Abstract
In this entry we will compare the discrete output speed using Arduino Mega 2560 code versus specific register programming.
-------ooooOOOOoooo-------

Una de los factores que ha hecho tremendamente popular al Arduino y ha acercado el HW al usuario medio es la capacidad para programarlo sin ser un experto en programación y microcontroladores.

Escribir código usando las librerías que proporciona Arduino es un gran avance ya que nos proporciona un nivel de abstracción respecto al HW. Sin embargo, todo ése código que nos hace la vida fácil tiene un coste en tiempo de ejecución. Dependiendo del destino que le demos a nuestro diseño, ése tiempo puede ser asumible o no.

Veamos un par de ejemplos comparando la programación con librerías Arduino con la programación directa por registros.

1. PROGRAMACIÓN CON LIBRERÍAS ARDUINO
Para éste ejemplo, vamos a mover lo más rápido posible el pin 12 del Arduino usando las librerías Arduino.

void setup() {
  pinMode(12, OUTPUT);
}

void loop() {
    digitalWrite(12, HIGH); 
  digitalWrite(12, LOW); 
}

Arduino Mega 2560 Test de Velocidad
Fig.1 - Velocidad usando librerías Arduino

Como se aprecia en la figura 1, el resultado es una velocidad de conmutación media de 64 KHz. Se observa que esporádicamente el ciclo es inestable alterando a la frecuencia.

2. PROGRAMACIÓN CON DIRECTA CON REGISTROS
Para éste ejemplo, vamos a mover lo más rápido posible el pin 12 del Arduino programando directamente los registros del microcontrolador.


#include <avr/io.h> /* Defines pins, ports, etc */

int main(void) {
// -------- Inits --------- //

//Arduino mega 2560 pin 12 enable as output
DDRB |= (1 << PB6); /* Data Direction Register B: writing a one to the bitenables output. */

// ------ Event loop ------ //
while (1) {
PORTB = 0b01000000; /* Turn on pin 12 (PB6 pin) */
PORTB = 0b00000000; /* Turn off all B pins, including LED */
} /* End event loop */
return (0); /* This line is never reached */
}

Arduino Mega 2560 speed test
Fig. 2 - Velocidad con programación por registros
En la figura 2 se puede apreciar una velocidad significativamente superior 4 MHz. La frecuencia de generación es estable y no se producen inestabilidades como el mostrado en la figura 1.

3. CONCLUSIONES
  • La velocidad de funcionamiento del diseño definirá la forma de programar el Arduino.
  • En éste caso particular, programar directamente por registros multiplica la velocidad x63 respecto al uso de la librería de Arduino.
  • En el ejemplo se ha movido una sola línea. Mover el byte entero (8 líneas) a la vez, no consume más tiempo mientras que con las librerías de Arduino se multiplicaría por 8. Si moviésemos el byte entero supondría un incremente de velocidad de 63*8 = 504 veces más rápido.

2 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. EL PROBLEMA ES LA COMPILACION, MIENTRAS QUE PROGRAMAR POR REGISTROS ES MAS VELOZ ...PORQUE EL MICRO NO BUSCA EL PROGRAMA,SINO AL PROGRAMA DE MAQUINA...ES DECIR NO DEDE TRADUCIR NINGUNA INFORMACION MAS.

    ResponderEliminar