Todos los amantes de Arduino conocemos la función digitalWrite que se utiliza para activar las salidas digitales. Muchos la hemos utilizado para manejar pantallas LCD por ejemplo o incluso distintos drivers que necesitan de distintos pines digitales para su funcionamiento y por norma general la velocidad de ésta función no es precisamente rápida. Lo podemos notar en proyectos donde necesitamos manipular un puerto entero de forma rápida. Pues bien, ésta función toma más de 50 ciclos de reloj para su ejecución, lo cual es demasiado si queremos velocidad. Os dejo un pequeño trozo de código de Bill que muestra cómo manejar el puerto directamente y ejecutar lo mismo pero en tan sólo 2 ciclos de reloj. Recordemos que Arduino no es más que una plataforma montada alrededor de un pequeño chip AVR y podemos utilizar código nativo :)
Las pruebas se han realizado sobre un Arduino Atmega328 a 16 MHz.
Éstos son los 3 métodos utilizados para la prueba de rendimiento:
- digitalWrite(pin, LOW); digitalWrite(pin, HIGH);
- CLR(PORTB, 0) ; SET(PORTB, 0);
- PORTB |= _BV(0); PORTB &= ~(_BV(0));
Y las macros correspondientes:
#define CLR(x,y) (x&=(~(1<<y)))
#define SET(x,y) (x|=(1<<y))
#define _BV(bit) (1 << (bit))
Resultados de la prueba:
En la siguiente prueba, se invierte el estado de un pin. Las funciones utilizadas son éstas:
- digitalWrite(pin, !digitalRead(pin))
- PORTB ^= (_BV(0))
- sbi(PINB,0)
#define sbi(port,bit) (port)|=(1<<(bit))
Los resultados:
Se puede ver claramente que para operaciones de éste tipo es mucho mejor utilizar la gestión de puertos directa. De hecho, podreis ver más información sobre éstos métodos en la própia página de arduino aqui.
Fuente: billporter