closeThis post has been published 4 years 4 months 24 days ago and may be out of date. Please read it carefully, I'm not responsible for any mistakes.

Zugegeben, der Arduino Befehls-Syntax ist sehr einfach und verständlich, leider bringt er ein paar Nachteile mit sich, vor allem wenn man den Aspekt der Geschwindigkeit betrachtet.

Diese kann man unterschiedlich angeben, entweder man beschreibt die Dauer der Abarbeitungszeit eines Befehls in Milli- oder Mikrosekunden, oder in Prozessortakten, wobei letztere abhängig von der Taktrate der CPU ist. (Hier in diesem Fall arbeite ich mit einem Arduino Leonardo mit 16MHz)

Der Grund, warum die Standart-Arduino-Befehle langsamer sind, liegt darin, weil ein “digitalWrite(5, HIGH)” nicht nur den Pin 5 auf einen High-Pegel setzt, sondern es werden weitere Abfragen und Überprüfungen vorgenommen, um Konflikte zu vermeiden.
Ist ein Pin PWM-fähig, wird diese Funktion zuerst deaktiviert, bei der direkten Portzuweisung passiert das nicht.

 

DigitalWrite

Um einen Pin auf High oder Low zu setzen, gibt es den C-Befehl “Port”. Hierbei ist zu beachten, dass ein Pin nicht durch eine Dezimalzahl wie 17 oder 3 adressiert wird, sondern es ist alle Pins in 4 Blöcke bzw. Register (A, B, C, D) aufgeteilt, in jedem ist genau ein Byte, also 8 Bits/Pins.

Diese Anschlussbelegungen unterscheiden sich je nach Mikroprozessor, einfach für das benötigte Arduino-Board nach Port-Mapping oder Ähnlichem suchen.

Dadurch, dass immer ein Block/Register auf einmal aktualisiert wird, kann man in einem Durchgang sogar 8 Pins gleichzeitig (um)schalten, wenn diese denn dem gleichen Block zugewiesen sind.

 

Der Syntax hierfür sieht so aus:

Der Platzhalter [Block] ist mit dem Buchstaben auszutauschen, das “B” definiert den Wert als Binärzahl (“0b” geht auch) und ist nicht weiter relevant, außer die 8 nachfolgenden Zahlen, die den Zustand (0/1, High/Low) repräsentieren.

 

Zusätzlich habe ich einen kurzen Testcode geschrieben, der die Zeit ausgibt, die der Arduino braucht, um den Befehl auszuführen. Grundsätzlich können alle Arduino-Boards über die Methode micros() einen Timerwert in Mikrosekunden ausgeben, dieser hat jedoch nur eine Auflösung von 4µS, bei Boards mit 8MHz dann 8µS.

Deshalb wird die Messung 1000-Mal ausgeführt und man erhält eine Zeitangabe in Nanosekunden, natürlich nur in 4- bzw. 8nS-Schritten.

 

Das Messergebnis schaut dann etwa so aus:

Jetzt zeigt sich der Geschwindigkeitsvorteil gegenüber dem Standartbefehl der Arduino-Umgebung, die direkte Portzuweisung ist ungefähr 12-Mal so schnell!

Sinnvoll wird das auch beim simplen Erzeugen von Rechtecksignalen an einem Pin, mit DigitalWrite beträgt die maximal erreichbare Frequenz etwa 72kHz, beim C-Befehl 874kHz.

 

 

DigitalRead

Was beim Schreiben des Ausgangszustandes eines Pins funktioniert, gilt natürlich auch beim Lesen welcher Pegel angelegt ist, binär versteht sich.

Also mal eben das Testprogramm angepasst, viel ändert sich nicht an den Zeiten:

Arduino: 6332ns
C-Befehl: 516ns

Der Syntax setzt sich aus dem Befehl “PIN” und der Blockvorwahl zusammen, es wird eine Binärzahl zurückgegeben:

[Total: 0    Average: 0/5]

Leave Comment

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.