Arduino vs. PIC nop. Ist das dasselbe?

Wenn ich die folgende Codezeile in einem Arduino-basierten Projekt habe:

__asm__("nop\n\t");

Wird dies genau den gleichen Effekt haben wie nop in PIC12F675? Spielt es eine Rolle, dass der betreffende PIC und der Arduino mit unterschiedlichen Geschwindigkeiten arbeiten können?

Ich frage mich nur, warum der Link, den ich hier zu einer früheren Frage hatte, woher der Code stammt, entfernt wurde? Entschuldigung, ich bin ziemlich neu hier.
@stevenvh es ging um den Bau eines IR-Senders (und nicht um einen Roboter), und es war die Quelle des PIC-Codes, den ich als Referenz zur Verfügung stellte. Danke

Antworten (2)

A NOPdauert normalerweise 1 Anweisungszyklus . Der PIC12F675 scheint die Uhr für einen Befehlszyklus durch vier zu teilen:

„Ein Befehlszyklus besteht aus vier Oszillatorperioden; bei einer Oszillatorfrequenz von 4 MHz ergibt dies eine normale Befehlsausführungszeit von 1 μ s.“ (Datenblatt S. 71)

Ein 20-MHz-Takt ergibt also eine Verzögerung von 200 ns (4/20 MHz).

Geben Sie hier die Bildbeschreibung ein

Der in Arduino OTOH verwendete AVR liefert 1 MIPS/MHz, sodass er bei einem Takt von 20 MHz höchstwahrscheinlich eine Verzögerung von 50 ns (1/20 MHz) ergibt.

das ist perfekt, ich kann meinen Code anpassen, um diese Änderungen zu berücksichtigen. Gibt es eine Reihe von Begriffen oder Themenbereichen, die ich recherchieren kann, die solche Konzepte weiter erklären? Ihre Antwort beantwortet meine Frage perfekt, ich meine nur zur Weiterbildung meinerseits. Danke.
Bei weiteren Recherchen scheint die Verzögerung 62,5 ns zu betragen: arduino.cc/playground/Main/AVR
Yikes, nun bin ich verwirrt :) 250ns scheint viel zu sein
vielen Dank nochmal für die tollen Informationen. Eine verwandte "Unter" -Frage: Gibt es eine Möglichkeit, dies ohne Oszilloskop zu testen?
@ElectroNoob - Ja. Erstellen Sie eine lange Verzögerung mit mehreren verschachtelten Schleifen, z. B. 10 Sekunden, und schalten Sie für diese Zeit eine LED ein. Fügen Sie dann das NOP in Ihrer innersten Schleife hinzu und zählen Sie, wie oft diese Schleife ausgeführt wird. Wenn das 10 000 000 Mal ist, hat sich die Verzögerung von 10 Sekunden auf 12,5 Sekunden verlängert.
@stevenvh: Ja, dieser PIC verwendet 4 Taktzyklen pro Befehlszyklus. Einige der 24-Bit-Kernteile wie die andere Frage betrafen die Verwendung von 2 Taktzyklen pro Befehl. Die 30F-Serie, die ebenfalls ein 24-Bit-Kernteil ist, verwendet jedoch 4 Taktzyklen pro Befehlszyklus. Du musst das Datenblatt prüfen.
@stevenvh: Das spricht über Arduinos, die mir egal sind, und AVRs, mit denen ich nicht vertraut bin, also kann ich nicht sagen, ob es falsch ist oder nicht.
@ElectroNoob - Nein, du hast mich verwirrt! Die 62,5 ns sind korrekt. Ich dachte, wir reden immer noch über den PIC. Aber Arduino ist AVR! Und das macht 1 MIPS/MHz, wie ich auch in meiner Antwort sagte. Entschuldigung für die Verwirrung!

Jeder Prozessor hat seinen eigenen Befehlssatz und damit seine eigene Assemblersprache. Tatsächlich kann es verschiedene Assembler für denselben Prozessor geben, jeder mit einer etwas anderen Syntax. Es ist der Assembler , der angibt, welche Namen Sie angeben müssen, um bestimmte Anweisungen anzuzeigen. Typischerweise verwenden Assembler die gleichen Namen für Anweisungen (sogenannte Befehls-Mnemonik ), die die Dokumentation für den Prozessor verwendet, aber das ist nicht immer der Fall. Sie fragen nach Anweisungen auf zwei verschiedenen Prozessoren mit unterschiedlichen Assemblern, daher können Sie im Allgemeinen keine Ähnlichkeit annehmen, nur weil die Namen gleich sind.

Im Laufe der Jahre haben sich jedoch einige gebräuchliche (allerdings nicht standardmäßige) Befehlsnamen herausgebildet. Ein solcher Name ist NOP, was sich auf No OPeration bezieht . Die meisten Prozessoren haben einen Befehl, der nichts tut, und die meisten Assembler nennen diesen Befehl NOP. Aber auch hier gibt es keine Garantie dafür, dass dies auf einen bestimmten Assembler zutrifft, also sollten Sie immer überprüfen, anstatt anzunehmen.

Ich kenne den AVR-Befehlssatz nicht und schon gar nicht, wie er von den Arduino-Tools dargestellt wird. Ich weiß daher nicht, was das Arduino NOP tut, auf das Sie sich beziehen. Wenn es tatsächlich nur einen Befehlszyklus dauert und nichts weiter tut, als der Name NOP vermuten lässt, dann ja, es hat den gleichen Effekt wie der NOP-Befehl des PIC 12F675 (eigentlich ein 14-Bit-Kerngerät). Auf den traditionellen PIC-Geräten mit 14-Bit-Kern nimmt NOP ein einzelnes Befehlswort und wird in einem einzelnen Befehlszyklus ausgeführt.

NOPs werden normalerweise verwendet, um kurze Wartezeiten in Code einzufügen, z. B. das Warten auf eine Mikrosekunde, bis sich eine Zeile beruhigt hat. Übrigens, wenn Sie auf diesem PIC 2 Anweisungszyklen verschwenden möchten, können Sie dies mit der einzelnen Anweisung "GOTO $ + 1" tun, mit ein paar Einschränkungen, auf die es sich nicht lohnt, hier einzugehen.

Der 6809 (der schönste 8-Bitter aller Zeiten) hatte einen BRN (Branch Never)-Befehl, aufgrund der Orthogonalität des Befehlssatzes: Es gab einen BRA (BRanch Always), und jeder Branch-Befehl hatte sein Komplement, also gab es auch den BRN.
@stevenvh: Die NMOS 6502-Serie hatte einige undokumentierte Opcodes, die einen Speicheroperanden verarbeiteten und das Ergebnis ignorierten. Ein „nop 0“ war ein Zwei-Byte-Befehl, dessen Ausführung drei Zyklen dauerte (im Gegensatz zu „nop“, der zwei Bytes/zwei Zyklen umfasste). Nützlich als Teil einer Verzögerung mit einer ungeraden Anzahl von Zyklen. Es gab einen Nichtstun-Opcode, der aus zwei Bytes/zwei Zyklen bestand. Ein "Absolutspeicher lesen und das Ergebnis ignorieren" könnte nützlich sein, um einen Zwei-Byte-Befehl zu überspringen. Die Anweisungen "BIT zp" und "BIT abs" waren dokumentierte Anweisungen, die Speicher lesen und nur Flags betreffen.
@stevenvh: Die BIT-Anweisungen wurden früher oft verwendet, da es keine Unterstützung für die undokumentierten gab. Beachten Sie, dass manchmal das Überspringen von Anweisungen (oder sogar die Verwendung von "nop 0") zu Problemen führen kann, wenn der resultierende Lesezyklus versehentlich die Hardware beeinflusst (z. B. ein Interrupt-Statusregister "Clear on Read" getroffen hat).
MC6800 hatte eine unendliche Dauer "NOP" :-) - auch bekannt als HCF oder "Halt & Catch Fire" = $dd. Implementieren Sie es und softwaretechnisch hat es lange Zeit "nichts getan". Die Adressleitungen wurden jedoch mit Taktrate (Clock/4 in MC6802) gezählt, was für das Testen von Adressdecodern und ähnlichem sehr nützlich war. Ein nützlicher Code für "Hände hoch und weggehen"-Ereignisse und Speicherfallen. Ungenutzten Speicher mit $dd füllen. Wenn der Prozessor jemals das Universum verlassen würde, würde er sicher sein, es nicht zufällig an anderer Stelle wieder zu betreten. Ob dies eine gute Idee war, hing davon ab auf Antrag usw.