Arduino: schnellere Alternativen zu digitalread () und digitalwrite ()?

13

Was sind die schnellsten Alternativen zum Aufrufen der Arduino-Funktionen digitalread()und digitalwrite()? AVR-spezifische oder chipspezifische Lösungen sind akzeptabel.

Mark Harrison
quelle
3
Wenn Sie dies und Ihre letzte Frage lesen, möchten Sie anscheinend ziemlich schnell etwas unternehmen. Ich denke, Sie geben Details darüber an, was es ist und wie schnell es nützlich sein könnte.
Oli Glaser
@Oli, gute Idee, danke. Aktuelles Projekt ist ein Tuning-System für RC-Sender. Es funktioniert gut, aber ich möchte die Dekodierung des RC PWM-Signals effizient gestalten, damit ich das gleiche Framework für andere Projekte verwenden kann. Hier ist ein Bericht über das, was ich bisher habe: eastbay-rc.blogspot.com/2011/11/…
Mark Harrison

Antworten:

18

Greifen Sie direkt auf die digitalen Ports zu!

Die 3 Methoden, die ich getestet habe, waren

  • digitalWrite (Pin, LOW); digitalWrite (Stift, HOCH);
  • CLR (PORTB, 0); SET (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[...]

Bildbeschreibung hier eingeben

Wie Sie sehen, dauert digitalWrite ungefähr 56 Zyklen, während die direkte Port-Adressierung 2 Zyklen dauert. Das ist ein großer Zeitunterschied für Programme mit vielen E / A-Operationen!

Marty
quelle
2

Greifen Sie wie oben vorgeschlagen direkt auf die digitalen Anschlüsse zu. Aber mit Stil!

Wenn Sie fest codierte Werte direkt in die Hardwareregister schreiben, verlieren Sie an Lesbarkeit und Portabilität.

Ich habe auf Github ein Tool namens HWA veröffentlicht, mit dem Sie eine objektorientierte Schnittstelle zu der Hardware verwenden können, für die kein C ++ - Compiler erforderlich ist und das hocheffizienten Binärcode erzeugt.

HWA ist da: https://github.com/duparq/hwa

Duparq
quelle
1
"Hocheffizienter Binärcode" würde sich zusammen mit den tatsächlichen Messungen viel zuverlässiger anhören.
Dmitry Grigoryev
2

Leute bei Arduino.SE haben dies bereits diskutiert und getestet. Wie sich herausstellt, digitalWriteFast()ist nicht viel Verbesserung gegenüber regulären digitalWrite(). Der direkte Portzugriff ist jedoch ungefähr 35-40-mal schneller als digitalWrite().

Dmitry Grigoryev
quelle
0

Verwenden Sie das ChipKit Uno32. Es ist viel schneller als die AVR-basierten Arduinos. Es wird sich auch mit Ihren Timing-Problemen befassen.

Leon Heller
quelle
1
Ich denke nicht, dass der Kauf schnellerer Hardware die beste Antwort ist, zumindest nicht, bis Sie die Grenzen Ihrer aktuellen Hardware erreicht haben und entschieden haben, dass Sie etwas schnelleres benötigen.
Jon L
1
Warum die Abstimmungen? Er wollte die schnellste Lösung, nicht nur eine schnellere, die ich bereitgestellt habe. Kann jemand eine schnellere Arduino-basierte Lösung vorschlagen?
Leon Heller
12
Denn das ChipKit ist kein Arduino, sondern eine Arduino-kompatible Plattform. Dies bedeutet, dass das Port-Switching zwar schneller ist, einige Bibliotheken jedoch mit großer Wahrscheinlichkeit neu geschrieben werden müssen. Ethernet-, XBee- und SD-Kartenbibliotheken funktionieren möglicherweise nicht ohne weiteres. Darüber hinaus fragt Mark ausdrücklich nach alternativen Funktionsaufrufen von digitalRead / Write, nicht nach einer neuen Plattform (doh).
Hans
2
Ein Hardwarewechsel ist niemals eine gute Lösung. Zumindest verpassen Sie einiges an gutem Lernen und werden nie erfahren, wie effizient die Hardware eingesetzt werden kann.
Rick_2047
1
@ Rick_2047 Ich würde nicht "nie" sagen - wenn der Bedarf neu oder erweitert ist oder die Menge steigt, kann es sinnvoll sein, Alternativen zu suchen. Ich stimme jedoch zu, dass es nicht schwierig ist, Hardware blindlings auf grobe Software-Ineffizienzen zu werfen - manchmal funktioniert es sogar nicht, da leistungsstärkere Systeme für bestimmte Aufgaben zusätzlichen Aufwand verursachen und manchmal langsamer als einfachere enden. Es gibt wirklich keinen Ersatz dafür, etwas über die Plattform zu lernen, die Sie nutzen oder über die Sie nachdenken.
Chris Stratton