Was passiert mit AVR-Registern während Mehrzyklusanweisungen?

7

Dies ist eher eine theoretische Frage ... (Auch meine erste zu Stack Overflow)

Ich frage mich, was mit den Registern des Atmel AVR-Mikrocontrollers (dh ATTINY85) während eines Mehrzyklusbefehls passiert.

Das heißt, es ADIWdauert zwei Zyklen, um einem Zwei-Byte-Register (Wortregister) ein Sofortregister hinzuzufügen.

Ich stelle mir vor, dass während des ersten Zyklus eines der Bytes bearbeitet wird und dann im nächsten Zyklus das andere Byte bearbeitet wird. Aber ist dieser Prozess überall dort definiert, wo ich lesen kann? Und was ist mit den anderen Mehrzyklusanweisungen?

Im Wesentlichen interessiert mich der Zustand des Mikrocontrollers nach jedem einzelnen Zyklus, auch innerhalb von Anweisungen mit mehreren Zyklen.

Tristan
quelle
5
Ich denke, es würde Ihnen sehr schwer fallen, diese Informationen von jemand anderem als Atmel zu erhalten. Im schlimmsten Fall wäre es ein Geschäftsgeheimnis, im besten Fall wäre es völlig irrelevant, wenn Sie die MCU nicht kopieren wollten.
Ignacio Vazquez-Abrams
Aha. Danke, Ignacio. Ich habe gerade festgestellt, dass ich die MCU manuell extern takten und dann während einer Anweisung zurücksetzen kann. Ich bin nicht sicher, ob die Register (SRAM) initialisiert werden, aber dies könnte einen Versuch wert sein.
1
Es ist zwar interessant zu wissen, aber wenn es kein messbares Verhalten beeinflusst, müssten Sie dies nicht einmal duplizieren, wenn Sie versuchen würden, einen arbeitsähnlichen Prozessor (Simulator, fpga-Softcore usw.) zu erstellen. Vermutlich können sich Interrupts nicht dazwischen einfügen - oder wenn doch, wird die erste Operation nicht festgeschrieben und wird nach der ISR wiederholt.
Chris Stratton
@ ChrisStratton, stimmte zu. Es ist eher eine theoretische Frage unserer Neugier (für ein Konzeptkunstbuch, an dem ich arbeite, das eine Simulation von Code enthält, der auf einer MCU ausgeführt wird). Ich werde einen Test versuchen, bei dem ich die MCU manuell extern takte und sie mitten in einer Mehrzyklusanweisung zurücksetze. Ich glaube, dass die Maschinenregister noch intakt sind und ich kann die MCU ihre Werte ausgeben lassen.
Tristan
7
Ich habe gerade einen Hardwaretest im Studio durchgeführt und kann bestätigen, dass ADIWdas untere Ergebnisregister nach dem ersten Zyklus und das obere Ergebnisregister nach dem zweiten Zyklus aktualisiert werden. Dazu habe ich die MCU manuell extern über den Ausgang eines anderen Chips getaktet und die ursprüngliche MCU in der Mitte des ADIWBefehls zurückgesetzt. Beim Zurücksetzen testete die MCU dann ihre niedrigeren und höheren Ergebnisregister, und interessanterweise wurde nur das niedrigere Ergebnisregister aktualisiert. Wenn ich stattdessen die MCU nach der vollständigen ADIWAnweisung zurücksetze , wurden sowohl das niedrigere als auch das höhere Ergebnisregister aktualisiert.
Tristan

Antworten:

1

Hier ist meine Interpretation:

Damit ein 8-Bit-uC 16-Bit-Berechnungen durchführen kann, muss er zuerst die niedrigstwertigen Bits berechnen und dann zu den höchstwertigen Bits wechseln. Der erste Zyklus addiert also 8-Bit mit einem Übertrag und addiert dann diesen Übertrag zu den höheren 8 -Bits.

Im abstrakten Sinne kann 8-Bit keine 16-Bit-Berechnung in einem einzelnen Befehl durchführen, da sich die Ergebnisse gegenseitig beeinflussen.

I.Omar
quelle
Das ist nicht unbedingt wahr. Obwohl dies ein ungewöhnliches Design wäre, ist es für einen Mikrocontroller mit einem 8-Bit-Speicherbus durchaus möglich, intern einen 16-Bit-Addierer zu haben, sodass er diese Addition in einem einzigen Taktzyklus durchführen kann. Es würde immer noch mehrere Taktzyklen dauern, um einen 16-Bit-Wert zu lesen / schreiben, aber es könnte sie in jeder gewünschten Reihenfolge ausführen.
Abenddämmerung -inaktiv-
Ich meinte auch 8-Bit-CPU, nicht nur Speicher. Sie können mich gerne korrigieren, wenn ich falsch liege, aber die Nichtübereinstimmung von CPU und Speicher ist für mich seltsam. Wissen Sie, dass eine MCU dies tut?
I.Omar
@duskwuff: Eine CPU kann nicht nur eine interne ALU haben, die breiter als der Speicherbus ist, sondern auch tatsächlich implementiert und kommerziell erfolgreich sein - das Motorola 68008 und der Intel 8088, die im ursprünglichen IBM-PC verwendet werden, verfügen beide über 16-Bit-ALU und 8- Bit-Datenbus, und ich bin mir ziemlich sicher, dass das Motorola 6809 auch.
Davidcary