Hallo zusammen, ich habe eine kurze AVR Detailfrage. Beim Abhandeln vom Code im AVR ist mir die Reihenfolge der Manipulation der SREG-Flags nicht ganz klar. Geht man hier von oben nach unten (I->C) oder anders herum (C->I). z.B. bei AND Bit: Operation 4: SFlag = NFlag xor VFlag 3: VFlag = 0 Wird zuerst das SFlag berechnet oder das VFLag auf 0 gesetzt. Weiß jemand wo die richtige Reihenfolge beschrieben ist?
Die Flags werden im gleichen Taktschritt gesetzt ansonsten hilft dir vielleicht das hier: http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf
ich schrieb: > mir die Reihenfolge der Manipulation der SREG-Flags nicht ganz klar. Es gibt keine Reihenfolge. Die werden gleichzeitig gesetzt.
Stefan E. schrieb: > ich schrieb: >> mir die Reihenfolge der Manipulation der SREG-Flags nicht ganz klar. > > Es gibt keine Reihenfolge. Die werden gleichzeitig gesetzt. Was dank schreib-/denkfaul gemachter Doku dazu führt, daß bei z.B. AND das "xor VFlag" eigentlich nichts macht, außer Verwirrung zu stiften.
Carl D. schrieb: > Was dank schreib-/denkfaul gemachter Doku dazu führt, daß bei z.B. AND > das "xor VFlag" eigentlich nichts macht, außer Verwirrung zu stiften. Ich finde das nicht "schreib-/denkfaul", sondern konsistent. Es kann genauso zu Verwirrung führen, wenn für die Instruktion die Beschreibung des Verhaltens anders ist als für andere.
Rolf M. schrieb: > Carl D. schrieb: >> Was dank schreib-/denkfaul gemachter Doku dazu führt, daß bei z.B. AND >> das "xor VFlag" eigentlich nichts macht, außer Verwirrung zu stiften. > > Ich finde das nicht "schreib-/denkfaul", sondern konsistent. Es kann > genauso zu Verwirrung führen, wenn für die Instruktion die Beschreibung > des Verhaltens anders ist als für andere. Was ist daran konsistent, wenn das Verhalten nur durch die nicht Beschriebene Annahme "V wird auf 0 gesetzt und danach in der Verknüpfung N^V verwendet" erklärbar ist. Oder man schreibt eben "V = 0; S = N". S ist auch nicht nur der Ausgang eines Xor-Gatters, denn man kann N, S und V unabhängig voneinander setzen/löschen. S ist also ein echtes Register und dann stellt sich schon die Frage, ob Vn oder Vn-1 benutzt wird. Öder eben "0" für beide Verknüpfungen, was der Hardware-Wahrheit sicher am näherten kommt.
Ok, das heißt die Berechnungsvorschrift lautet: Bit: Operation 4: SFlag(n) = NFlag(n-1) xor VFlag(n-1) 3: VFlag(n) = 0
Carl D. schrieb: > Was ist daran konsistent, wenn das Verhalten nur durch die nicht > Beschriebene Annahme "V wird auf 0 gesetzt und danach in der Verknüpfung > N^V verwendet" erklärbar ist. Es wurde doch schon gesagt: Es wird nicht nach irgendwas anderem gemacht, sondern gleichzeitig. Vor der Instruktion stehen die Register irgendwie, nach der Instruktion stehen sie genau so, wie diese Gleichungen besagen. > Oder man schreibt eben "V = 0; S = N". Dein Fehler ist, dass du da einen zeitlichen Ablauf hinein interpretierst, der gar nicht existiert. Das sind keine Codezeilen, die eine nach der anderen ausgeführt werden. Es ist einfach nur eine Beschreibung des Zustands der Flags nach Ausführung der Instruktion. > S ist auch nicht nur der Ausgang eines Xor-Gatters, denn man kann N, S > und V unabhängig voneinander setzen/löschen. Nach Ausführung der Instruktion entspricht der Wert in S dem Ergebnis von N xor V. Nicht mehr und nicht weniger sagt diese Zeile aus. Sie bedeutet weder, dass die Flags eins nach dem anderen gesetzt werden, noch, dass da irgendwo ein physisches XOR-Gatter den Wert erzeugt. > S ist also ein echtes Register und dann stellt sich schon die Frage, ob > Vn oder Vn-1 benutzt wird. Nur wenn man es nicht richtig verstanden hat.
... schrieb: > 4: SFlag(n) = NFlag(n-1) xor VFlag(n-1) Nein. Es hilft allerdings, eine wenigstens kleine Vorstellung der Arbeitsweise von Prozessoren zu haben. Dahingehend, dass aus der ALU ein paar Zustände rauskommen, die anschliessend als Flags gespeichert werden. Und so kommen aus der ALU eben u.A. ein Vorzeichenstatus und ein Überlaufstatus raus. Nur ist der Überlaufstatus bei einer AND Operation eben 0. Eine Einbeziehung des vorigen Zustandes gibt es beim AVR allerdings auch, das gibts sonst nicht so oft. Und zwar in der Handhabung des Z Flags bei den Operationen CPC und SBC
Sry, aber eine uC ist eine Maschine und damit deterministisch. Deine Beschreibung ist: Eingang -> etwas magisches passiert -> Ausgang. Es muss eine ganz klare mathematische Beschreibung geben, was da passiert. Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine glasklare Reihenfolge und die lautet: 1. bestimme N 2. ermittle daraus S
ich schrieb: > Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine > glasklare Reihenfolge und die lautet: Ich kann auch S und N mit einem Draht verbinden, dann sind die auch gleich, aber deine Schrittfolge findet nicht statt.
ich schrieb: > Sry, aber eine uC ist eine Maschine und damit deterministisch. Natürlich. > Deine Beschreibung ist: > > Eingang -> etwas magisches passiert -> Ausgang. Ob der Prozessor nun mit magischem Rauch oder mit irgendwelchen Gattern und Badelatschen funktioniert, spielt eigentlich keine Rolle. Die Beschreibungen der Instruktionen sollen nicht die interne Funktion des Prozessors erklären, sondern das Ergebnis der Instruktion. Wie es zustande kommt, ist doch dafür vollkommen irrelevant. > Es muss eine ganz klare mathematische Beschreibung geben, was da > passiert. Die beschreibt aber einen Zusammenhang und keinen Ablauf. > Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine > glasklare Reihenfolge und die lautet: > 1. bestimme N > 2. ermittle daraus S S = N ist mathematisch zu 100% äquivalent zu N = S. Beides sagt einfach aus, dass die beiden Werte gleich sind, ohne dass es dazu irgendeine Reihenfolge gäbe. Deshalb schrieb ich ja: Es sind keine Codezeilen, sondern ein mathematischer Zusammenhang. Bei Programmcode wäre es tatsächlich so wie du schreibst: Der Wert von N wird gelesen und dann nach S kopiert.
Wobei man fairerweise reinsehen sollte, was Atmel tatsächlich verbrochen hat. Ein "=" findet sich da nicht. V,N,Z ist klar beschrieben, aber nicht S. Wenn man nicht weiss, wozu S gut ist, weshalb das so definiert ist, kann man bei dieser Vorwärtsreferenz schon auf seltsame Gedanken kommen. Weiter vorne im PDF, in der Beschreibung von SREG, stehts auch nicht deutlicher drin. Da dieses S Flag branchenuntypisch ist, hilft auch kein Blick in die Runde. Meist verwenden Sprungbedingungen die 4 Flags N,Z,V,C mit Kombinatorik in der Auswertung der Bedingung, aber nicht bei Atmel.
ich schrieb: > Sry, aber eine uC ist eine Maschine und damit deterministisch. Jepp. Aber sie ist nicht zeitlos, sondern arbeitet synchron in Takten. Kombinatorische Logik zwischen zwei Takten kann aber beliebig komplex sein (solange die Summe von deren Gatterlaufzeiten kleiner als eine Periode der Taktfrequenz ist). Aus Sicht der Maschine können deshalb Ergebnisse durchaus "gleichzeitig" erscheinen, die logisch voneinander abhängig sind. > Es muss eine ganz klare mathematische Beschreibung geben, was da > passiert. Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine > glasklare Reihenfolge und die lautet: > 1. bestimme N > 2. ermittle daraus S Jepp, die zuständigen Gatter in der ALU werden das wohl auch so umsetzen. Die Maschine bekommt aber von dieser Reihenfolge nix mit. Für die stehen im nächsten Takt einfach die korrekten Ergebnisse in beiden Flags.
A. K. schrieb: > V,N,Z ist klar beschrieben, aber > nicht S. Das stimmt leider. Hier ist die Dokumentation, vorsichtig ausgedrückt, unzureichend. Man könnte auch einfach sagen: beschissen. Allerdings hat dieser Sachverhalt eigentlich nichts mit dem gedanklichen Problem des TO zu tun. Denn das besteht ganz klar darin, dass diesem nicht klar ist, das beim AVR8 (und auch praktisch jeder anderen Architektur) sehr viel kombinatorische Logik asynchron zum MCU-Takt arbeitet, aus Sicht des Programms also scheinbar das Gesetz der Kausalität verletzen kann.
ich schrieb: > Sry, aber eine uC ist eine Maschine und damit deterministisch. Deine > Beschreibung ist: > > Eingang -> etwas magisches passiert -> Ausgang. > > Es muss eine ganz klare mathematische Beschreibung geben, was da > passiert. Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine > glasklare Reihenfolge und die lautet: > 1. bestimme N > 2. ermittle daraus S Die Sache ist eigentlich simpel. Es gibt vor dem SREG ein Schaltwerk, das den gleichen Wert (hier 0) für das Speichern des V-Bits liefert, den es auch für das Xor mit N benutzt, dessen Ergebnis im S-Bit gespeichert wird. Es wird durch die Schreibeweise in der Doku der Eindruck erweckt, daß es eine zeitliche Abfolge gäbe und damit erst N^V berechnet wird und dann V auf "0" gesetzt wird. Das ist wohl nicht so. Es wäre auch nicht wirklich sinnvoll. Genauso wenig wie es sinnvoll ist ein DB als Rätselbuch zu gestallten. Gerade wenn man nämlich schon mal gehört hat was ein getaktetes Schaltwerk ist, rechnet man damit, das die Eingangswerte nicht die zukünftigen Ausgangwerte sein können. Und Zunkunft ist dabei alles, was noch mehr als 0ps braucht, um berechnet zu sein. "=0" dauert auch mehr als 0ps.
Aus meiner Sicht ist nichts falsch, irreführend oder rätselhaft an der Darstellung in der Beschreibung der Status-Flags. Die Fragestellung ergibt sich aus der falschen Interpretation der Beschreibung. Sie ist nicht imperativ (das ist hier indirekt schon gesagt worden, indem man bestritt, dass die Ausdrücke in einer bestimmten Reihenfolge interpretieren muss) sondern "deklarativ" oder "prädikativ". Zum den Eigenschaften dieser Sprachtypen in Bezug auf die Programmierung siehe: https://de.wikipedia.org/wiki/Programmierparadigma Analoge Eigenschaften gibt es in Bezug auf z.B. auf mathematische oder boolesche Gleichungen. Sie sind "deklarativ" gemeint und auch so zu interpretieren. Der Vorwurf, es handele sich in diesem Fall um Irreführung, Schlampigkeit oder irgendeine Form der unreflektierten Ausdrucksweise etc. ist unberechtigt. Es ist verständlich, dass ein Anfänger der Programmierung, der mit einer imperativen Sprache beginnt, zunächst anderen Texte, die syntaktisch damit identisch oder verwandt erscheinen, spontan auch als "imperativ" gemeint interpretieren. Aber das ist allgemein nicht korrekt und trifft hier im Einzelfall nicht zu.
Theor schrieb: > [...] Sie ist nicht imperativ (das ist hier indirekt schon > gesagt worden, indem man bestritt, dass die Ausdrücke in einer > bestimmten Reihenfolge interpretieren muss) sondern "deklarativ" oder > "prädikativ". Sorry, Rolf. Du hast das zusätzlich direkter gesagt.
Theor schrieb: > Aus meiner Sicht ist nichts falsch, irreführend oder rätselhaft an der > Darstellung in der Beschreibung der Status-Flags. Dokumentation hat mitunter auch den Zweck, jenen, die etwas noch nicht verstanden haben, das vermisste Verständnis zu vermitteln. Wenn man die Doku jedoch erst versteht, nachdem man bereits verstanden hat, was damit ausgesagt werden soll... ;-) Eine instruction set reference ist allerdings keine Anleitung und setzt Vorwissen voraus.
Beitrag #5564448 wurde von einem Moderator gelöscht.
Theor schrieb: > Analoge Eigenschaften gibt es in Bezug auf z.B. auf mathematische oder > boolesche Gleichungen. Sie sind "deklarativ" gemeint und auch so zu > interpretieren. Steht ja auch direkt drüber: "Boolean Formula".
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.