Was passiert mit AVR-Registern während Multi-Zyklus-Befehlen?

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

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

dh ADIWes dauert zwei Zyklen, um einem Zwei-Byte-(Wort-)Register ein Direktwert 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 irgendwo definiert, wo ich ihn lesen kann? Und was ist mit den anderen Multi-Cycle-Anweisungen?

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

Ich denke, dass es Ihnen sehr schwerfallen würde, diese Informationen von jemand anderem als Atmel zu bekommen. Im schlimmsten Fall wäre es ein Betriebsgeheimnis, im besten Fall wäre es völlig irrelevant, es sei denn, Sie wollten die MCU kopieren.
Ich verstehe. Danke, Ignacio. Ich habe gerade festgestellt, dass ich die MCU manuell extern takten und dann während einer Anweisung zurücksetzen kann. Ich bin mir nicht sicher, ob die Register (SRAM) initialisiert werden, aber dies könnte einen Versuch wert sein.
Es ist zwar interessant zu wissen, dass Sie dies nicht einmal duplizieren müssten, wenn Sie versuchen würden, einen gleich funktionierenden Prozessor (Simulator, FPGA-Softcore usw.) zu erstellen, es sei denn, es wirkt sich auf messbares Verhalten aus. Vermutlich können sich Interrupts nicht dazwischen einfügen - oder wenn dies der Fall ist, ist die erste Operation nicht festgeschrieben und wird nach ihrer ISR wiederholt.
@ChrisStratton, einverstanden. Es ist eher eine theoretische Frage unserer Neugier (für ein konzeptionelles Kunstbuch, an dem ich arbeite, das eine Simulation von Code enthält, der auf einer MCU läuft). Ich werde einen Test versuchen, bei dem ich die MCU manuell extern takte und sie mitten in einem Multi-Zyklus-Befehl zurücksetze. Ich glaube, dass die Maschinenregister noch intakt sind, und ich kann die MCU ihre Werte ausgeben lassen.
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 wird. Dazu habe ich die MCU manuell über den Ausgang eines anderen Chips extern getaktet und die ursprüngliche MCU mitten in der ADIWAnweisung zurückgesetzt. Beim Zurücksetzen testete die MCU dann ihre unteren und oberen Ergebnisregister, und interessanterweise wurde nur das untere Ergebnisregister aktualisiert. Wenn ich stattdessen die MCU nach dem vollständigen ADIWBefehl zurücksetze, wurden sowohl das untere als auch das höhere Ergebnisregister aktualisiert.
Es wäre vernünftig anzunehmen, dass die Register, die der Befehl aktualisieren soll, was auch immer sie sein mögen, erst zuverlässig lesbar sind, nachdem der Mehrzyklusbefehl abgeschlossen ist. Es wäre auch vernünftig anzunehmen, dass die Register, in die der Befehl nicht schreiben soll, während des gesamten Befehls unberührt bleiben.
Ich glaube nicht, dass die MCU etwas anderes tut, als die adiw-Anweisung auszuführen. Dann ist es zwischen den beiden Zyklen unmöglich, eine weitere Anweisung auszuführen. Ein solcher Befehl verwendet die zwei Zyklen und dann führt die MCU den nächsten Befehl aus oder bedient den nächsten IRQ.
Veröffentlichen Sie Ihre Ergebnisse hier als Antwort @Tristan und ich werde sie positiv bewerten

Antworten (1)

Hier meine Deutung:

Damit ein 8-Bit-uC 16-Bit-Mathematik durchführen kann, muss es zuerst die niedrigstwertigen Bits berechnen und dann zu den höchstwertigen Bits wechseln, sodass der erste Zyklus 8 Bits mit einem Übertrag hinzufügt und dann diesen Übertrag zu den höheren 8 hinzufügt -Bits.

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

Das ist nicht unbedingt wahr. Obwohl es 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, der es ihm ermöglicht, diese Addition in einem einzigen Taktzyklus durchzuführen. 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.
Ich meinte auch 8-Bit-CPU, nicht nur Speicher. Sie können mich gerne korrigieren, wenn ich falsch liege, aber die Diskrepanz zwischen CPU und Speicher ist für mich seltsam. Wissen Sie, dass eine MCU dies tut?
@duskwuff: Es ist nicht nur möglich, dass eine CPU eine interne ALU hat, die breiter als der Speicherbus ist, sondern tatsächlich implementiert und kommerziell erfolgreich - das Motorola 68008 und das Intel 8088, die im ursprünglichen IBM-PC verwendet werden, haben beide 16-Bit-ALU und 8- Bit-Datenbus, und ich bin mir ziemlich sicher, dass das Motorola 6809 das auch tut.