Was sind die schnellsten Alternativen zum Aufrufen der Arduino-Funktionen digitalread()
und digitalwrite()
? AVR-spezifische oder chipspezifische Lösungen sind akzeptabel.
Was sind die schnellsten Alternativen zum Aufrufen der Arduino-Funktionen digitalread()
und digitalwrite()
? AVR-spezifische oder chipspezifische Lösungen sind akzeptabel.
Antworten:
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));
[...]
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!
Diese Bibliothek ist eine gute Alternative: http://code.google.com/p/digitalwritefast/
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
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()
.
Verwenden Sie das ChipKit Uno32. Es ist viel schneller als die AVR-basierten Arduinos. Es wird sich auch mit Ihren Timing-Problemen befassen.