Quelles sont les alternatives les plus rapides à l'appel des fonctions Arduino digitalread()
et digitalwrite()
? Les solutions spécifiques aux AVR ou aux puces sont acceptables.
Quelles sont les alternatives les plus rapides à l'appel des fonctions Arduino digitalread()
et digitalwrite()
? Les solutions spécifiques aux AVR ou aux puces sont acceptables.
Réponses:
Accédez directement aux ports numériques!
Les 3 méthodes que j'ai testées étaient
- digitalWrite (pin, LOW); digitalWrite (pin, HIGH);
- CLR (PORTB, 0); SET (PORTB, 0);
- PORTB | = _BV (0); PORTB & = ~ (_BV (0));
[...]
Comme vous pouvez le voir, digitalWrite prend environ 56 cycles pour se terminer, tandis que l'adressage direct du port prend 2 cycles. C'est une grande différence de temps pour les programmes qui ont beaucoup d'opérations d'E / S!
Cette bibliothèque est une bonne alternative: http://code.google.com/p/digitalwritefast/
Comme suggéré ci-dessus, accédez directement aux ports numériques. Mais avec style!
En écrivant des valeurs codées en dur directement dans les registres matériels, vous perdez en lisibilité et en portabilité.
J'ai publié sur Github un outil que j'ai appelé HWA qui vous permet d'utiliser une interface orientée objet vers le matériel qui ne nécessite pas de compilateur C ++ et produit du code binaire à haute efficacité.
HWA est là: https://github.com/duparq/hwa
Les gens d'Arduino.SE ont déjà discuté et testé cela. En fait, il digitalWriteFast()
n'y a pas beaucoup d'amélioration par rapport à la normale digitalWrite()
. L'accès direct au port, cependant, est environ 35 à 40 fois plus rapide que digitalWrite()
.
Utilisez le ChipKit Uno32. C'est beaucoup plus rapide que les Arduinos basés sur AVR. Il traitera également vos problèmes de synchronisation.