Arduino: des alternatives plus rapides à digitalread () et digitalwrite ()?

13

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.

Mark Harrison
la source
3
En lisant ceci et votre dernière question, il semble que vous vouliez faire quelque chose assez rapidement. Je pense que donner des détails sur ce que c'est et à quelle vitesse pourrait être utile.
Oli Glaser
@Oli, bonne idée, merci. Le projet actuel est un système de réglage pour les émetteurs RC. Cela fonctionne bien, mais je voudrais rendre le décodage du signal RC PWM efficace afin que je puisse utiliser le même cadre pour d'autres projets. Voici un résumé de ce que j'ai jusqu'à présent: eastbay-rc.blogspot.com/2011/11/…
Mark Harrison

Réponses:

18

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));

[...]

entrez la description de l'image ici

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!

Marty
la source
2

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

duparq
la source
1
«code binaire à haute efficacité» semblerait beaucoup plus fiable avec les mesures réelles.
Dmitry Grigoryev
2

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().

Dmitry Grigoryev
la source
0

Utilisez le ChipKit Uno32. C'est beaucoup plus rapide que les Arduinos basés sur AVR. Il traitera également vos problèmes de synchronisation.

Leon Heller
la source
1
Je ne pense pas que l'achat de matériel plus rapide soit la meilleure réponse ici, du moins pas avant d'avoir atteint les limites de votre matériel actuel et décidé que vous avez besoin de quelque chose de plus rapide.
Jon L
1
Pourquoi les downvotes? Il voulait la solution la plus rapide , pas seulement la plus rapide, que j'ai fournie. Quelqu'un peut-il suggérer une solution plus rapide basée sur Arduino?
Leon Heller
12
Parce que le ChipKit n'est pas un Arduino, mais une plate-forme compatible Arduino. Cela signifie que bien que la commutation de ports soit plus rapide, il existe une forte probabilité de réécriture de certaines bibliothèques. Les bibliothèques de cartes Ethernet, XBee et SD peuvent ne pas fonctionner du tout. De plus, Mark demande spécifiquement des appels de fonction alternatifs de digitalRead / Write, pas une nouvelle plateforme (doh).
Hans
2
Changer de matériel n'est jamais une bonne solution. À tout le moins, vous manquez un bon apprentissage et n'apprendrez jamais ce qui serait une utilisation efficace du matériel.
Rick_2047
1
@ Rick_2047 Je ne dirais pas "jamais" - si l'exigence est nouvelle ou étendue ou si la quantité augmente, il peut être judicieux de chercher des alternatives. Mais je conviens que jeter aveuglément du matériel à des inefficacités logicielles flagrantes n'est pas sophistiqué - parfois cela ne fonctionne même pas, car les systèmes plus performants peuvent ajouter des frais généraux et parfois finir plus lentement que les plus simples pour certaines tâches. Il n'y a vraiment aucun substitut pour en savoir plus sur la plateforme que vous utilisez ou envisagez d'utiliser.
Chris Stratton du