wie schafft es ein RISC Prozessor wie ARM oder AVR einen Befehl in nur einem Zyklus durchzuführen?
Es muss ja der Befehl geholt werden, dekodiert werden, die nötigen Variablen geladen werden eine Berechnung mit der ALU durchgeführt werden und dann das Ergebnis und mögliche Statussignale gesetzt werden.
Es muss ja der Befehl geholt werden,
Kein Problerm bei Onchip ROM wie AVR
dekodiert werden,
Kein Problem bei RISC, da werden wenige bits (ca. 8) decodiert, der Rest geht direct als addressbit an die registerbank
die nötigen Variablen geladen werden
Kein Problem bei RISC typischen 'großen Registerbanken' und onchip RAM
eine Berechnung mit der ALU durchgeführt werden
Kein Problem, wenn man komplexe Befehle wie MUL an Coprozessoren auslagert
und dann das Ergebnis und mögliche Statussignale gesetzt werden.
Flags setzt die ALU nebenher.
Thx
Tipp: besorg dir ein Buch über Computerarchitektur, dann kannst du Dich selber schlau machen und musst nicht das Forum mit theoretischen Pillepalle beschäftigen.
Du kannst dir auch den source code von Sngle cycle CPU's anschauen, bspw. hier im Forum: https://www.mikrocontroller.net/articles/PiBla
Ein wichtiger Aspekt dabei ist das Design des Befehlssatzes: man achtet z.B. darauf, dass jeder Befehl einen Bus maximal einmal benutzt. D.h. z.B., dass man eine feste Befehlslänge hat und dass Immediate-Operanden direkt im Opcode stehen und keinen zweiten Zyklus auf dem Instructionbus benötigen. Man hat keine Read-Modify-Write-Befehle auf's RAM, würden den Datenbus zweimal benutzen. Usw.
Den Tackt in Mikroschritte zu zerlegen konnte schon die Oktale CDC Maschine auf der ich meine Technikerausbildung gemacht habe. 8kB Ringkernspeicher Papertape Reader Konsole aus einer Kugelkopf Schreibmaschine und ein Bandlaufwerk mit 8" Spulen sowie eine 6MB Wechselfestplatte ware da angesagt.
Du kannst dir auch den source code von Sngle cycle CPU's anschauen,
ah na klar man kann das/ muss das ja auch in HDL beschreiben können.
Also ich finde vor allem interessant welche Schaltung da verwendet wird,
um die Befehle rechtzeitig zu bearbeiten.
Rechtzeitig ist einfach wenn der Takt nur langsam genug ist. Single cycle CPUs haben, verglichen mit pipelined CPUs, sehr niedrige Taktfrequenzen (bei gleicher Fertigungstechnologie).
Nachdem ihr jetzt die einfache Frage geklaert habt, wie schaffen
es superscalare Microcontroller (z.B SH2A) zwei Befehle pro Takt
auszufuehren? :)
Wo siehst du da ein Problem?
Das Problem ist doch offensichtlich.
In einer CPU ohne Pipelining ginge das gar nicht.
Und was, wenn eine Data-Dependency zwischen den Befehlen besteht?
Ja klar.
Also eine massive Steigerung der Silicon-Komplexität mit
einhergehender niedrigerer Taktrate.
Null Gewinn.
Mumpitz.
Komplex wird ein Design erst durch das Pipelining. Und was heisst schon niedrige Taktrate, für einen 8 MHz AVR in einer Kaffeemascine ist die Taktrate schon mehr als genug.
Oder der multi-cycle 6502 auf 1 MHz im Apple II, der hatte noch genügend Takt für bit-toggling und Sound erzeugung übrig. Jaja Katzenvideaos laufen darauf nicht, aber wer braucht die schon.
Bei den heutigen IC-Strukturbreiten ist es kein problem eine single-cycle RISC-CPU im zweistelligen MHz Bereich laufen zu lassen.
AVR haben zwei separate Speicher und Busse für Befehle und Daten. Deswegen können diese unabhängig voneinander gleichzeitig angesprochen werden. Dazu kommt, das der Programmspeicher einen 16 Bit Bus hat, so dass der nächste Befehl und sein Operand gleichzeitig geladen werden können. AVR laden den nächsten Befehl schon, während der vorherige noch abgearbeitet wird. Und dann solltest du bedenken, dass ein Taktzyklus zwei Flanken hat, die man nutzen kann.
Zum Beispiel (weiss jetzt nicht ob das bei AVR exakt so ist):
Steigende Flanke: Eingabe holen und Befehl ausführen
Fallende Flanke: Ergebnis ausgeben und nächsten Befehl holen.
Ein ST62 schafft 13 Befehle per Takt.
Oder waren es 13 Takte je Befehl.
Ein Takt per Befehl ist ein alter Hut.
Das konnten die DSPs schon lange bevor jemand R.I.S.C.
ueberhaupt buchstabieren konnte.
Oder mehrere Operationen per Befehl in separaten Adressraeumen.
Ein Takt per Befehl ist ein alter Hut.
Das konnten die DSPs schon lange
Hier geht es um Microcontroller.
Dass Spezialhardware in Spezialfällen mehr kann, sollte klar sein.
Der Extremfall ist der FPGA, der alles in einem Takt machen kann, wenn er genug Gates hat.
Begrenzende Faktoren sind aber immer
Data dependencies
Bus contention
Busbreiten
Anzahl der parallel vorhandenen Funktionsblöcke (z.B. ALU)
Der Extremfall ist der FPGA, der alles in einem Takt machen kann, wenn
er genug Gates hat.
Da begibst du dich jetzt aber auf ganz duennes Eis.
Ein solches Design waere asynchron. Nicht das es nicht grundsaetzlich
ginge. Es macht aber keiner ohne ganz grosse Not.
Wenn man Pech hat, schmilzt einem das Silizium im Package weg.
Solange noch Silizium uebrig ist, versicht sich der arme Kaefer
dann neu zu konfigurieren.
Hier geht es um Microcontroller.
Wenn man von einem D.S.P. das D. und das S. weglaesst, bleibt
ein P. uebrig. Es ist sicherlich ein wenig dekadent seine
Strings in etwas groessere :) Wortbreiten zu packen.
Aber es geht auch! Ich habe es probiert.
wie schafft es ein RISC Prozessor wie ARM oder AVR einen Befehl in nur
einem Zyklus durchzuführen?
Hi, lese gerade ganz gespannt, habe mich das auch schon oft gefragt. Kam derzeit eher aus der PIC (Harvard) Welt, dort wurde der Takt immer erstmal durch 4 geteilt auf den Taktverteilungs Blockschaltbildern ... da war klar, okay, die Dinger nutzen dann also die Flanken dazwischen um das zu schaffen, zumindest habe ich mir das immer so zurecht gereimt, zumal die PICs ja wirklich alles nach und nach durch die ALU bewegen...
Das spiegelte sich auch in den Assembler Befehlstrukturen wieder, beim PIC waren das immer ein Operanden Befehle und nun beim AVR sind es ja eher drei Operanden Befehle.
Das Problem ist doch offensichtlich.
In einer CPU ohne Pipelining ginge das gar nicht.
Und was, wenn eine Data-Dependency zwischen den Befehlen besteht?
Ich fand es immer sehr bizarr wenn man im Singlestep im Debugger
durch den Code gegangen ist und man sah wie sich dann der Positionsbalken geteilt hat weil manchmal nur ein Befehl abgearbeitet wurde, dann zwei, dann warte der eine auf den anderen, dann springt er vor.
Und der Compiler bemueht sich auch die Befehle optimal anzuordnen.
Da steckt schon eine Menge Gehirnschmalz drin.
Dagegen ist eine MCU die nur 1Befehl pro Zyklus macht doch das nahe liegende. Wuerde ich ganz ahnungslos selber eine MCU designen, wuerde vermutlich sowas rauskommen. Viele Zyklen waren dann irgendwann ein Teil von Luxus. (vgl: DJNZ beim Z80) oder das man Gatter sparen wollte. (Multiplikation)
Wenn man einen FPGA mit einem asynchronen Design fuettert,
hat man keine Kontrolle ueber die Anzahl der parallel ausgefuehrten
Operationen. Und die ist eben, entgegen deiner Meinung, doch
limitiert. Weil solche Schaltvorgaenge als laestiges Nebenprodukt
Waerme durch die Schaltverluste erzeugen.
Diese Limitierung laesst also ein "Grundsaetzlich" praktisch nicht zu.
Ansonsten wuerden es alle machen. Weil es natuerlich schneller ist.
Ein mit einem asynchronen Design zu 100 % gefuellter FPGA,
wuerde binnen weniger Sekunden seinen magischen Rauch entweichen
lassen sobald er etwas tun soll.
Ein DSP ist kein universeller RISC-Mikrocontroller.
Wie gut das meine verbauten DSPs das nicht wissen.
Scheinbar kann ich auf das "universelle" recht gut verzichten.
Ich fand es immer sehr bizarr wenn man im Singlestep im Debugger
durch den Code gegangen ist und man sah wie sich dann der
Positionsbalken geteilt hat weil manchmal nur ein Befehl abgearbeitet
wurde
Das hat viel mit Optimierung durch den Compiler zu tun, wenig mit dem betrachteten Thema.
Du hast meine Aussage vollkommen aus dem Kontext gerissen.
Moeglicherweise.
Weil du so ein lustiges Kerlchen bist :).
Und für deinen DSP? ;-)
Es sind mehrere!
Fuer die allerersten waere ein selbst gehosteter Compiler
vielleicht doch etwas viel vom Gewicht her.
Aber wenn man sich die ganz alten UNIX®-Quellen so anschaut,
koennte man es wohl doch nicht ganz ausschliessen sich da
einen CC zu zimmern.
Die allerzweiten sind schon vom Hersteller mit (Cross-)compilern
versorgt.
Bei der IBM® musste Mann natuerlich nach Cobol fragen.
Und so schlecht ist Fortran 1 ja auch nicht.
Aber immer die Lochkarten mit Zeilennummern stanzen!
Bildfehler?
Der arbeitet lt. Bild nur im ersten Takt, alle anderen sind idle. Jajaja, die in Karl-Marx-Stadt denken nochn auch eine CPU hat einen acht von 24 Stunden Arbeitsrhythmus.
wie schafft es ein RISC Prozessor wie ARM oder AVR einen Befehl in nur
einem Zyklus durchzuführen?
Beim AVR weiß ich nicht - aber beim ARM kann man so grob sagen: mehrere Optimierrunden - und Abhängigkeiten. Beispielsweise Befehl a 1 Takt, danach aber für 2 Takte blockiert.
Um bei gewissen Vorgängen wie Sprüngen, Cache-Nutzung oder Programmwechseln weniger Zeit zu verbrauchen werden Vohersage-Techniken eingesetzt.
Man schaut sich besser die Timing-Tabellen zu den einzelnen Prozessormodellen und den Befehlen genauer an, und sollte die auch vergleichen, um
Optimierungen/Relativierungen zu erkennen
Abhängigkeiten zu erkennen.
Pipelines ziehen einen verzögerten Datenzugriff hinter sich her.
Bildfehler?
Der arbeitet lt. Bild nur im ersten Takt, alle anderen sind idle.
Jajaja, die in Karl-Marx-Stadt denken nochn auch eine CPU hat einen acht
von 24 Stunden Arbeitsrhythmus.
So lange die Einen den gesamten Ablauf betrachten und die Anderen sich daraus die Rosinen rauspicken, redet man nebeneinander her.
Der Ur-8051 teilte den Quarztakt durch 12 je Befehl. Damit gab es keine Probleme, um z.B. eine Flagregister per Interrupt zu setzen, bzw. per Befehl zu löschen. Beides erfolgte per Read-Modify-Write in verschiedenen Phasen der 12 Takte. Z.B. mit dem JBC-Befehl kann man einen Interrupt abfragen und löschen, ohne einen Interrupt zu verlieren.
Als dann aber die 8051 mit Teiler 1:1 rauskamen (z.B. AT89LP51), gab es massive Probleme und Bugreports, um das gleiche Verhalten in nur einem Takt zu erreichen.
Und es steht auch schon auf der erste Seite: ein cycle für einen Befehl
(meistens).
Fehlschluss. Wenn ein Prozessor einen Befehl pro Takt ausführt, dann bedeutet dies nicht, dass der Befehl nur einen Takt dauert. Ebendies wird erst durch Pipelining erreicht, wenn auch beim AVR nur rudimentär. Weil in diesem Fall beim AVR stets zwei Befehle gleichzeitig in Arbeit sind, in verschiedenen Stadien ihres Ablaufs.
Wenn ein Prozessor einen Befehl pro Takt ausführt, dann
bedeutet dies nicht, dass der Befehl nur einen Takt dauert.
Doch genau das bedeutet es hier.
Ebendies
wird erst durch Pipelining erreicht, wenn auch beim AVR nur rudimentär.
Nein, bei den single-cycle-Befehlen macht der AVR kein Pipeling. Deshalb röttelt er ja auch mit langsamen einstelligen Takten.
Und beim ARM gibt es welche mit und welche Ohne Pipelining. Wahrscheinlich hat pipeling für embedded mehr Nach- als Vorteile (Ruhestrom, Echtzeit-vorhersagbarkeit).
Und beim ARM gibt es welche mit und welche Ohne Pipelining.
Wahrscheinlich hat pipeling für embedded mehr Nach- als Vorteile
(Ruhestrom, Echtzeit-vorhersagbarkeit).
Kann es sein, dass du gar nicht weißt, was Pipelining ist?
Und es steht auch schon auf der erste Seite: ein cycle für einen Befehl
(meistens).
Du interpretierst das falsch. Ja, von sehr vielen Instruktionen können einer pro Takt abgearbeitet werden. Das heißt aber nicht, dass die auch nur einen Takt dauern würden, tatsächlich dauern sie (die mit einem Takt Durchsatz angegebenen) zwei Takte. In einem wird das Befehlswort geholt und decodiert, im zweiten erfolgt die Abarbeitung. Der entscheidende Trick ist: WÄHREND dieser Abarbeitung wird bereits das Befehlswort der nächsten Instruktion geholt und decodiert. So ergibt sich der Durchsatz von einem Takt pro Instruktion.
Das ist die simpelste Form von Pipelining.
Im übrigen kann man das selbst in der Instruktionstabelle an vielen Stellen sehen, nämlich überall dort, wo Code-Verzweigungen auftreten. Denn dann kann logischerweise nur für einen Zweig das Holen des nächsten Befehlsworts verschachtelt werden. Geht's auf Grund der Bedingung in den anderen Zweig, war der Prefetch nutzlos und es hagelt einen "Straftakt", nämlich genau den, der nötig ist, um das erste Befehlsort dieses alternativen Codezweigs einzulesen und zu decodieren. Siehe z.B. all die br*-Instruktionen.
Und welche meistens meint sieht man im Instruction-Set (Auszug
AVR-Datasheet ebenfalls im Anhang).
Tja, zwischen einfach nur lesen und wirklich verstehen liegen manchmal halt auch Welten. Aber immerhin sehr löblich, dass du wenigstens liest. Viele schaffen ja nichtmal dies...
Aber in einer Stage (also ohne Pipelining) läuft keine der Instruktionen durch.
Das früheste ist Ex1, wenn ich jetzt nichts übersehe. Das wäre in diesem Fall 3 Stages.
Sieht man ja, dass es mehr Takte braucht um einen Zyklus auszuführen, also werden intern mehr Taktflanken inerhalb eines Taktes erzeugt oder nicht?
Zumal -> wenn man zwei Operanden über einen Bus holt, geht das doch schlecht gleichzeitig, verstehe ich dort schon gar nicht... Das ist doch die Frage, wie bekommen sie zwei Operanden und in einem Takt an die ALU und vor allem dann noch das Ergebnis wieder dort weg...
Also ich komme mit den Darstellungen dort nicht zurecht...
Hier ein Pipelining-Beispiel für Arm (Die verschiedenen Arm-Prozessoren
unterscheiden sich hier stark untereinander):
Wobei dort auch schon der eminent wichtige vordere Teil der Pipeline fehlt, nämlich Fetch/Predict. Aber für Anfänger sind diese Highends zwei Klassen zu komplex.
also werden intern mehr Taktflanken inerhalb eines Taktes erzeugt oder
nicht?
6502 und der eben verlinkte ARM1 verwenden mit ihren Takten Φ1 und Φ2 auch irgendwo Taktflanken innerhalb einer Taktperiode. Aber das ist nicht wirklich massgeblich für die Betrachtung hier. Man kann innerhalb eines Taktes auch mehrere Aktionen nacheinander durchführen, ohne dazwischen Latches/Register zu setzen. Exakt wie die oben gezeigten 3 Phasen der Execute-Stage des AVR ablaufen, ist nicht dokumentiert.
Lustig ist in dem Zusammenhang evtl., dass der ATMega328P Nachbau namens MD-328D und seine Brüder, an vielen Stellen 1 Takt fixer sind, als das Original.
Wenn ich mich richtig erinnere, war die Begründung, dass da drin ein zurecht gestutzter 16 Bit Kern werkelt.
Zumal -> wenn man zwei Operanden über einen Bus holt, geht das doch
schlecht gleichzeitig,
Ist auch nicht so. Register werden über mehrere Ports und Busse gleichzeitig angesprochen.
Obiges Diagramm fand ich einstmals in einem Paper der Oregon State University. Das Paper beschreibt den Ablauf in einem AVR sehr detailliert. Link wäre mir lieber, fand ich jetzt aber nicht. Quelle dürfte Reverse Engineering sein, nicht Atmel.
Lustig ist in dem Zusammenhang evtl., dass der ATMega328P Nachbau namens
MD-328D und seine Brüder, an vielen Stellen 1 Takt fixer sind, als das
Original.
Auch beim Original gibt es hier Varianten. Siehe ATXmega und vor allem dessen Erben, die ganzen neueren AVR8-Baureihen.
Vermutlich haben die Chinesen einen raubkopierten XMega-Core mit der (ebenfalls raubkopierten) ollen ATMega-Peripherie kombiniert.
Naja, wenn die Chinesen irgenwas können, dann ist das: Kopieren. Wenn sie das Ergebnis dann wirklich umfassend dokumentieren würden, wäre dagegen ja nichtmal etwas einzuwenden...
wird erst durch Pipelining erreicht, wenn auch beim AVR nur rudimentär.
?Rudimentäres Pipelining", ist das sowas wie der "rudimentäre Schwanz des Homosapiens", auch Coccyx????
Also Pipeling wird nach Stufen unter Angabe einer Ganzzahl klassifiziert.
Beispielsweise 6-stufige Pipeline beim MC68040 oder 20-stufige beim Pentium 4 'Prescott'.
Was soll dann "rudimentäres Pipelining" sein??
Eine 1.5708963268-stufige Pipieline? Oder doch eher 0.5 stufige.
Also da hat man schon den Eindruck, da wird des Wort "rusimentäre" aus dem Hut gezaubert, wenn man unbedingt über etwas sprechen will, dessen Vorhandensein/Aufbau/Struktur aber man überhaupt nicht beschreiben kann. Diese Vorgehensweise soll im Marketing häufig vorkommen.
Thx
Tipp: besorg dir ein Buch über Computerarchitektur, dann kannst du Dich
selber schlau machen und musst nicht das Forum mit theoretischen
Pillepalle beschäftigen
geht eindeutig hervor dass es eine ganze menge 8 Bit Verbindungen gibt, gerade unter ALU, Registern und RAM, anders kanns ja auch gar nicht gehen...sonst kommt man nie auf diese Geschwindigkeit bei der Abarbeitung ohne eine PLL.
Nein. Ja.
Zweistufiges Pipelining, also die Einführung einer zweiten Delay-Flipflop-Stufe in einen bestehenden Pfad zwischen zwei FF-Stufen ist tatsächlich die einfachste Variante des Pipelining.
Hier (AVR) wird aber kein kombinatorischer Pfad zur Taktsteigerung aufgebrochen. Hier ist bestenfalls eine Bufferstufe zwischen internen Flash und CPU-Core integriert. Das entspricht aber keiner Pipelinenestufe sondern einer BusInterfaceUnit - BIU, die fälschlicherweise dem Pipeling zugerechnet wird.
Und bei µC mit internen Programmspeicher meist überflüssig ist, da bei 100 ns (10MHz) ausreichen Laufzeitreserve ist.
Zur Erinnerung, Konservativ gerechnet, schafft ein Signal auf Kupfer in 100 ns 20 Meter 'gerade' Strecke.
Das Paper beschreibt den Ablauf in einem AVR sehr
detailliert. Link wäre mir lieber, fand ich jetzt aber nicht. Quelle
dürfte Reverse Engineering sein, nicht Atmel.
Eher nicht Reverse Engineering, das ist der Standard-Entwurf für einen Prozessor ohne Pipeling, aber mit Auftrennung in ProgrammSpeicherInterface (bei CPU mit externen Süpeicher auch BIU BusInterfaceUnit) und Ausführungseinheit.
Beide Einheiten sind über taktgesteuerte FF-Stufen verbunden.
Die Ausgangstufe der Ausgangseinheit ist das register PC (ProgrammCounter)
die Ausgangsstufe des Programmspeicher besteht aus drei weiteren register:
*IR (Instruction read), register für (einen Teil) des Instructionsword
*NPC (Next Programm counter: entweder PC+1(1 clock befehl) oder Sprungaddresse (2clock Befehle)
*DMA (Data Memory Address), die Adresse bei (Data-)Memory Zugriffen (also weder register noch intermediate)
Die selbe Struktur findet man auch in dem oben refenzierten PiBla-HDL-FPGA Code. Oder eben in Standard-Lehrbüchern zu Computerarchitektur, insbesonders Hennessey-Patterson.
Da braucht man kein Silicon abschleifen und re-engineering, das erschliesst sich aus dem Verständnis der Computerarchitektur.
Eher nicht Reverse Engineering, das ist der Standard-Entwurf für einen
Prozessor ohne Pipeling
Ob mit oder ohne Pipelining hat mit dem Entwurf selbst erst einmal wenig zu tun.
Wenn man diesen Entwurf ohne Pipelining betreiben würde, würden die Befehle halt 2 Takte brauchen, statt effektiv 1 Takt.
Ich verstehe gar nicht, warum du hier herumdiskutierst.
AVR hat Pipelining und es ist zweistufig. Und damit ist es rudimentär. Da gibt es doch überhaupt nichts zu diskutieren.
Soweit ich AVR verstehe, werden 1-Tick Instruktionen wie folgt ausgeführt, wobei AA die erste Instruktion ist etc:
1
123456
2
AA
3
BB
4
CC
5
DD
6
EE
7
123456
8
ABCDE = Ready
Um n Instruktionen auszuführen braucht's also n+1 Ticks, was bedeutet dass man i.W. 1 Instruktion / Tick hat?
Es gibt aber auch Instruktionen die 2 (z.B. LDS, STS, BR**) oder mehr brauchen (z.B. BR**, LPM, RETI) wobei das auch vom Core abhängt, und bei BR** ob eine 2-Byte oder 4-Byte Instruktion übersprungen wird.
Falls B, D und E 2-Tick Instruktionen sind:
1
12345678901
2
AA
3
BBB
4
CC
5
DDD
6
EEE
7
FF
8
GG
9
12345678901
10
A BC D EFG = Ready
Das sind dann 41+32+1 = 11 Ticks.
Das "+1" bedeutet effektiv, das ab Programmstart gerechnet, alle Instruktionen 1 Tick "zu spät" ihre Wirkung entfalten.
Ich verstehe gar nicht, warum du hier herumdiskutierst.
AVR hat Pipelining und es ist zweistufig. Und damit ist es rudimentär.
Da gibt es doch überhaupt nichts zu diskutieren.
Stimmt, das ist nicht-diskussionswürdiger Unsinn.
Erst schreibste rudimentär ist gleich zweistufig, also Pipelinegrad = 2. Und jetzt fabuliert Du von zweistufig plus rudimentär, also Pipelinegrad = 2.x
Das ist doch Unsinn.
Der AVR hat kein Pipeline, Registerdaten sind im folgenden Takt prozessiert, also normale Taktlatenz, keine zusätzliche Pipilinelatenz.
Anders als bspw. gepipelinden Multiplizierer, bei dem es länger als einen Takt dauert bis die Eingangsdaten fertig multipliziert sind (Pipilinelatenz).
Und damit ist es rudimentär.
Da gibt es doch überhaupt nichts zu diskutieren.
Na doch, dass der Begriff hier etwas holperig rüberkommt, kann damit zu tun haben, dass das Pipeline-Know bzw. der Schritt dahin, alles andere als trivial war.
Sprungvorhersage, Mikrocodierung, Register Renaming und all solche Scherze enthalten eine Menge Gehirnschmalz und Blut, selbst die CPU-Logik gehört da noch mit dazu - und wer meint (mit rudimentär) das könne man gewissermaßen alles in 21 Tagen lernen, wie C++ (oder mal eben an einem Nachmittag durch Lesen einer Forendisskussion) - sollte sich nicht über Beschwerden wundern.
Sprungvorhersage, Mikrocodierung, Register Renaming und all solche
Scherze enthalten eine Menge Gehirnschmalz und Blut, selbst die
CPU-Logik gehört da noch mit dazu
Ja. Und das alles hat mit dem Pipelining, wie es im AVR vorkommt, nichts zu tun.
Eben weil das Pipelining im AVR rudimentär ist.
Der AVR nutzt eine simple fetch- und eine execute-stage.
Der AVR hat kein Pipeline, Registerdaten sind im folgenden Takt
prozessiert, also normale Taktlatenz, keine zusätzliche Pipilinelatenz.
Auch mein PC Prozessor kann Integer-ALU Ergebnisse meist im Takt darauf in einer ALU verwenden, und nicht zwingend in der gleichen. Deinem Kriterium zufolge wäre er also nicht pipelined. ;-)
Die von dir vermisste Latenz bei Registerdaten gibt es aber durchaus. Nämlich zwischen dem Z-Register und dem PC-Register bei IJMP. Da geht der Weg vom Output der zweiten Stufe der Pipeline zurück zum Input der ersten, was einen Takt kostet.
Ob die Execute-Stage das direkt aus Z durchschiebt, wie bei IJMP, oder was reinaddiert, wie in PC = PC + Offset bei den relativen Sprüngen, ist in dieser Hinsicht aber egal.
Der AVR hat kein Pipeline, Registerdaten sind im folgenden Takt
prozessiert, also normale Taktlatenz, keine zusätzliche Pipilinelatenz.
Vielleicht liegt das Missverständnis darin, dass es in der Mikroarchitektur von Prozessoren Pipelining auf mehreren Ebenen geben kann. Und du eine andere Pipeline meinst als ich.
Einerseits gibt es Pipelining im Gesamtablauf. Sowas wie Fetch-Decode-Execute beim ersten ARM und eben Fetch-Execute bei AVR. Von dem ist hier die Rede, weil es um den Gesamtablauf der Befehle geht.
Andererseits kann es Pipelining in Execution Units geben. Wenn beispielsweise der Multiplizierer zwar 3 Takte braucht, bis er das Ergebnis liefert, aber in jedem Takt eine neue Multiplikation durchführen kann. In diesem Sinn ist die ALU des AVR nicht gepipelined.
Bei komplexeren CPUs hat man auch den Effekt, daß nach Interruptfreigabe oder RETI direkt nach dem Löschen des Interruptflags der Interrupt trotzdem noch angesprungen wird. Da muß auch erst noch eine Pipeline durchlaufen werden, ehe das Löschen angekommen ist.
Bei komplexeren CPUs hat man auch den Effekt, daß nach Interruptfreigabe
oder RETI direkt nach dem Löschen des Interruptflags der Interrupt
trotzdem noch angesprungen wird. Da muß auch erst noch eine Pipeline
durchlaufen werden, ehe das Löschen angekommen ist.
Bei den alten AVRs hatte SEI ja eine Latenz von 1 Instruktion, aber CLI nicht. Keine Ahnung, wie diese Asymmetrie entsteht.
Bei XMega wirkt SEI unmittelbar, d.h. vor der nächsten Instruktion kann eine IRQ triggern.
Vermutlich überträgt sich dieses Verhalten auch auf RETI?
Bei den alten AVRs hatte SEI ja eine Latenz von 1 Instruktion, aber CLI
nicht. Keine Ahnung, wie diese Asymmetrie entsteht.
Das hat ausnahmsweise einmal nichts mit Pipelining zu tun, sondern mit der SLEEP-Instruktion.
Mit einer 1er-Latenz für SEI ist es möglich sicher schlafen zu gehen, ohne durch eine Interrupt-Racecondition unendlich lange zu schlafen, falls der Interrupt vor dem sleep kommt.
1
sei
2
sleep ; sei wird erst hier - gleichzeitig mit sleep - aktiv und ein Interrupt weckt sleep wieder auf.
Der AVR hat kein Pipeline, Registerdaten sind im folgenden Takt
prozessiert, also normale Taktlatenz, keine zusätzliche Pipilinelatenz.
Vielleicht liegt das Missverständnis darin, dass es in der
Mikroarchitektur von Prozessoren Pipelining auf mehreren Ebenen geben
kann. Und du eine andere Pipeline meinst als ich.
Man nähert sich. Dem Graben, der unüberbrückbar ist. Es wird auf mehreren ebenen von Pipelining "gesprochen" was aber nicht bedeutet, das es tatsächlich pipeling ist.
Ich hab mal das entsprechende Kapitel aus der deutschsprachigen Fachliteratur (P.Pirsch: "Architekturen der digitalen Signalverarbeitung") gescannt und angehangen. Pipeling ist das Einfügen von Pipeline-Register um den kritischen Pfad in der Kombinatorik zu verkürzen.
Einerseits gibt es Pipelining im Gesamtablauf. Sowas wie
Fetch-Decode-Execute beim ersten ARM und eben Fetch-Execute bei AVR. Von
dem ist hier die Rede, weil es um den Gesamtablauf der Befehle geht.
Eben das ist Hardwaretechnisch kein Pipeling, wie schon 2006 hier diskutiert:
Beitrag "AVR +Pipelining"
Das sind zwei parallel arbeitsfähige Units: Prefetch und Execute. Das AVR_Manual (oder das -Marketing) führt dafür den Begriff single-level-pipelining ein, was die Auswahl der hier im Thread gemachten Klassifizierungen für ein und die desselbe Architektur weiter Vergrössert:
############
PC-Freak schrieb im Beitrag #7309256:
Fred Focus schrieb:
Tipp: besorg dir ein Buch über Computerarchitektur, dann kannst du Dich
selber schlau machen und musst nicht das Forum mit theoretischen
Pillepalle beschäftigen
Dafür ist das Forum da.
Nöö, das Forum ist nicht dazu da dir die Mühen des (Selbst-)studiums abzunehmen. Hier hat keiner Bock Dir den privaten und unbezahlten Hochschullehrer zu geben. Und wie man an der Kakophonie der hingeworfenen Begriffe/Antworten zu ein und der selben Frage sieht ist "das Forum" praktisch dazu garnicht in der Lage.
Eine Beschreibung von Pipelining der von mir skizzierten zweiten Art schliesst nicht die Verwendung des Begriffs in der ersten Art aus. Ich stecke in dem Thema schon recht lange und recht tief drin, um ausgiebig beiden Verwendungen begegnet zu sein.
Man kann anderen eine Brücke bauen, aber drüber laufen müssen sie selber. Weiter darüber zu diskutieren, halte ich für sinnlos.
Bei den alten AVRs hatte SEI ja eine Latenz von 1 Instruktion, aber CLI
nicht. Keine Ahnung, wie diese Asymmetrie entsteht.
Das hat ausnahmsweise einmal nichts mit Pipelining zu tun, sondern mit
der SLEEP-Instruktion.
Mit einer 1er-Latenz für SEI ist es möglich sicher schlafen zu gehen,
ohne durch eine Interrupt-Racecondition unendlich lange zu schlafen,
falls der Interrupt vor dem sleep kommt.
sei
sleep ; sei wird erst hier - gleichzeitig mit sleep - aktiv und ein
Interrupt weckt sleep wieder auf.
Und wie ist das aus XMega gelöst, wo SEI keine Latenz hat?
Auf die Schnelle hab ich in avr/sleep.h nix gefunden, sleep_cpu() bildet einfach nur auf SLEEP ab.
Ich
stecke in dem Thema schon recht lange und recht tief drin, um ausgiebig
beiden Verwendungen begegnet zu sein.
Soso, willste jetzt Alterspoker spielen? Wer am frühesten das Wort Pipeling im Gehörgang hatte gewinnt?!
Man kann anderen eine Brücke bauen, aber drüber laufen müssen sie
selber.
Nicht jede Brücke ist tragfähig. Und nicht jede Grenzüberschreitung ist der sprichwörtliche Schritt nach vorn (siehe Zeitenwende).
Weiter darüber zu diskutieren, halte ich für sinnlos.
Dann hättest Du dir diesen beitrag besser gespart.
Und statt Worte drüber auszutauschen ist die Selbsterfahrung, sprich der Eigenbau einer CPU bspw. im FPGA Erfahrungsreicher. Da macht den Unterschied zwischen marketinggetöse und technischer Terminologie schnell klar.
er am frühesten das Wort
Pipeling im Gehörgang hatte gewinnt?!
Kannst du nicht einfach aufhören?
Jeder hat verstanden, dass du eine andere Definition von Pipelining verwendest.
Und das ist auch in Ordnung.
Ich bleibe bei meiner und du bei deiner.
Ok?
er am frühesten das Wort
Pipeling im Gehörgang hatte gewinnt?!
Kannst du nicht einfach aufhören?
Warum ist es wichtig, wer hier wann aufhört?
Meinst Du derletzte gewinnt? Also doch Poker? Oder Hasenfußrennen?
Jeder hat verstanden, dass du eine andere Definition von Pipelining
verwendest.
Und das ist auch in Ordnung.
Ich bleibe bei meiner und du bei deiner.
Ok?
Nein, ist nicht OK, wenn es (mindestens) vier verschiedene Antworten auf die Frage "Wieviel Pipelinestufen hat der AVR" gibt.
Fragt Dich einer nach dem Ergebnis von 1 + 2, antwortest du ja auch "Drei" und nicht: Die Antwort ist "Rudimentär, also 3, was die kleinstmögliche Variante ist" ?!
Ja, dann. Gut.
Du wirst aber damit leben müssen, dass ich eine andere Meinung habe als du.
Warum ist es wichtig, wer hier wann aufhört?
Weil diese Diskussion zu nichts führt.
Du bist genau so wenig bereit von deinem Standpunkt abzurücken, wie ich.
Wir haben beide unsere Standpunkte begründet und definieren eine Sache eben etwas anders. Beide mit Begründung.
Damit wirst du leben müssen.
Ich kann es sehr gut.
Damit war das dann das letzte Wort von mir zu diesem Thema zu dir.
Damit war das dann das letzte Wort von mir zu diesem Thema zu dir.
OK, dann behalte ich mal:
"AVR hat Pipelining und es ist zweistufig. Und damit ist es rudimentär. "
als Deine Meinung in Erinnerung.
Wie auch den Text aus dem AVR-manual "Instructions in the program memory are executed with a single level pipelining."
Und trage damit in das Wörterbuch "MarWin-English/English-MarWin" die Zeile "zweistufiges Pipelining" (Marwin) = "single level pipelining" (engl.) ein.
Und soll ich jetzt, mehr Seiten kopieren um 'Unentschieden' zu erreichen? Also was ist jetzt konkret das was:
Mir reicht, was Hennessy/Patterson über Computer Architecture schreiben.
Ganz abgesehen davon, das du hier keinen Hennessey/Patterson als ISB verlinkst sondern einen Hennessey als einzig genannten Autor?
Anbei ein Scan aus 'meinem' Exemplar. Darin wird genannt, das man aus der Anzahl der Takte in der Ausführungszeit auf die Einzal der Pipelinestufen schliessen kann. Und da nun der AVR die meisten Opcodes in einem Takt ausführt (siehe die Scanschnipsel gestern) kann man bestenfalls von einer einstufigen Pipeline sprechen, aber keinesfalls von einer zweistufigen. Und dies stimmt auch mit dem AVR-Manual überein "single level pipelining".
Ob man eine einstufige Pipeline, also ein Förderband mit einer "Arbeitsstation" noch als Pipeling bezeichnen kann, ist vielleicht ein weiterer Disput. Aber von zweistufig kann man bei AVR wirklich nicht reden.
Der HenPat unterscheidet in Pipelining im Daten-Pfad und Pipeling im Steuerwerkvielleicht begründet das ja die Verwirrung. Ferner konzentriert er sich auf den Entwurf ganze Befehlssätze, die dann eben auf Pipeling optimiert sind. Beim AVR ist eben der Befehlssatz so optimiert, das die häufigsten Befhle (registeroperationen) durch Pipeling nicht optimiert werden können. Ein typischer Entwurfsansatz bei RISC-maschinen.
Ich vermute einmal, dass er kein Informatiker, sondern ein
Hardwareentwickler ist. Das würde es erklären.
Zumindest steckt er offenbar nicht wirklich in Rechnerarchitektur drin. Denn sonst wäre er schon längst massenhaft über https://en.wikipedia.org/wiki/Instruction_pipelining gestolpert. Kann man beim besten Willen nicht vermeiden.
Hennessey diese Art von Pipeline absprechen zu wollen, entbehrt nicht einer gewissen Komik. Immerhin gilt er als Schöpfer der Standford MIPS Prozessoren, ausgeschrieben Microprocessor without Interlocked Pipeline Stages. Und damit sind genau diese Art von Pipelines gemeint, und die Vermeidung von Locks durch Delay-Slots bei Lade- und Sprungbefehlen.
Es ist halt ein Begriff, der in unterschiedlichen Fachbereichen leicht
unterschiedliche Bedeutungen hat.
Wobei Pipelining von Execution Units auch Teil von Rechnerarchitektur ist.
Soweit ich das verstehe (achtung hier könnte ich falsch liegen) ist
two-way = two-level.
Der "single level pipelining" Ausdruck war mir bisher neu. Aber auch Google findet den fast nur im Kontext von AVRs. Generell ist der Begriff "level" im Kontext von Pipelining nicht üblich. Dein "way" übrigens auch nicht, der gehört zu Caches.
Soweit ich das verstehe (achtung hier könnte ich falsch liegen) ist
two-way = two-level.
Naja Wert auf eine gepflegte Hand-Bibliothek scheint man ja hier nicht zu legen ... Anbei das Blockbild für Cortex-M3 und -M4 aus ISBN: 978-01-12-408082-9.
Da steht 3-stage Pipeline und das bezieht sich wohl auf die Execution-Unit allein (Fetch/Decode/Execute), das Speicherinterface ist extra aufgeführt und wird wohl nicht zu den Pipeline-Stages hinzugerechnet.
Aber da ARM ein ganzer Zoo an CPU's ist, gibt es wohl auch einige mit höheren Angaben zu pieline-stages, eher aus der auf Performance gezüchteten A-Reihe, statt der für (stronspar-embedded) optimierten M-Reihe. Beim ARM-11 sollen es wohl 7 stages sein.
Scherzkeks, wikipedia hat nicht unbedingt den Status einer referenzierbarer fachliteratur, jedenfalls nicht allgemein. Den Artikeln über Fußballspieler mag man glauben, bei vielen anderen ist gesunde Skepsis angesagt.
Die IT-Artikel gehen selten über das Niveau von Computermagazin hinaus und oftmals verschlechtern sich die Artikel im Laufe der Zeit, weil irgendein Studiosis sich und seinen Nickname verweigen will und reinpresst was er gerade beim Mensagespräch von denen aufgeschnappt hat, die nicht die Vorlesung schwänzten.
Der "single level pipelining" Ausdruck war mir bisher neu. Aber auch
Google findet den fast nur im Kontext von AVRs. Generell ist der Begriff
"level" im Kontext von Pipelining nicht üblich. Dein "way" übrigens auch
nicht, der gehört zu Caches.
Ja, das sehe ich auch so. "Level" und "way" ist mir vorher im Zusammenhang mit Pipelines auch noch nicht untergekommen.
Google findet da auch praktisch nichts.
Festhalten kann man lediglich, dass weder "level" noch "way" das gleiche bedeuten wie "stages".
Ganz abgesehen davon, das du hier keinen Hennessey/Patterson als ISB
verlinkst sondern einen Hennessey als einzig genannten Autor?
Och menno. Was kann ich dafür, wie Amazon die Links nennt. Einmal draufgeklickt kommt "English edition by John L. Hennessy (Autor), David A. Patterson (Autor)" und auf dem Titelbild stehen auch beide. In beiden Ausgaben.
Ist das Standardwerk zu Rechnerarchitektur.
Anbei ein Scan aus 'meinem' Exemplar. Darin wird genannt, das man aus
der Anzahl der Takte in der Ausführungszeit auf die Einzal der
Pipelinestufen schliessen kann.
Kann man nicht, weil der Begriff "Ausführungszeit" mehrdeutig ist. Atmel/Microchip geben das an, was man in der Branche als "Latency" bezeichnet. Wie lange man drauf warten muss, bis es weiter geht. Die Fetch-Stage ist da nur drin, wenn sie relevant ist: bei Sprüngen. Das interessiert den Programmierer nämlich weit mehr als die Details der Mikroarchitektur.
Wenn beim 32-Bit Pentium 4 in diesem Sinn eine Ausführungszeit von 0,5 Takten für ADD reg,reg genannt wird, dann ändert das nichts an der von Intel genannten 20-stufigen Pipeline.
Scherzkeks, wikipedia hat nicht unbedingt den Status einer
referenzierbarer fachliteratur
Such halt woanders, du Scherzkeks. ARM verwendet den Ausdruck "Instruction Pipeline" ebenfalls, uvam. Die Erwähnung in der Wikipedia macht ihn ja nicht automatisch falsch.
Such halt woanders, du Scherzkeks. ARM verwendet den Ausdruck
"Instruction Pipeline" ebenfalls, uvam. Die Erwähnung in der Wikipedia
macht ihn ja nicht automatisch falsch.
Und der WP-Artikel "Instruction-Code" bedeudet jetzt genau ?was? in Bezug auf die Anzahl der Pipelinstufen im AVR?
Und in dem Bild aus der ARM-Literatur oben findet sich der Begriff "Instruction Pipeline" nicht sondern "3-stage pipeline" . Was kommt als nächstes? Kaffekochen auf einem Kaffeemaschine mit ARM-Prozessor und Interpretation der Muster die sich im Kaffeesatz bilden?!
Ich ja schon gut, ich nehme den Begriff "rudimentär" zurück und ersetze
ihn durch "minimal". ;-)
Oder eben einfach, vereinfacht, oder genauer "x-stufig".
Naja, ist Haarspalterei hier, ganz abgesehen von dem Hintergrund, dass Pipelining eher der schnelleren Programmabarbeitung dient - aber nicht unbedingt nahe bei der Ausgangsfrage ist.
Deswegen ja auch der Hinweise auf "Relativierungen" oben.
Vor allem beim ARM sollte man aber, sofern man nicht nur theoretisch unterwegs ist, das konkrete Modell genauer untersuchen, mit welchem man es zu tun hat.
Es muss ja der Befehl geholt werden, dekodiert werden, die nötigen
Variablen geladen werden eine Berechnung mit der ALU durchgeführt werden
und dann das Ergebnis und mögliche Statussignale gesetzt werden.
Die Frage war also, wie der Gesamtablauf eines Befehls bei AVR und ARM in einem Takt möglich sei. Also mit allem Gedöns, angefangen mit dem Fetch. Und das ähnelt der Frage, wie es möglich sei, dass die Sonne blau-weiss kariert ist. Weil die Voraussetzung der Frage falsch ist: Das dies alles in einem Takt geschähe.
Will man also auf diese falsch gestellte Frage sinnvoll antworten, kommt man um das Thema Pipelining nicht herum. Und auch nicht um die Erkenntnis, dass es von Fetch bis Writeback beim AVR 2 Takte sind, bei dem ARMen mehr. Und erst dann spielen die Unterschiede zwischen ARM1 und ARM11 eine Rolle.
Da hat sich nämlich von ARM1 bis Cortex A55 nichts verändert.
Also die ersten ARM's waren wohl nochmit Transfer Gates also 'dynamisch' fabriziert und skalierten so garnicht auf andere Taktfrequenzen. Zumal brauchte er zwei sich nicht überlappende takte die erst zusammen einen cycle realisierten.
Der ARM2 hatte dann zwei register mehr, mit ARM3 kam ein ein Swap Befehl hinzu
Bedingte Befehlsausführung und damit ein ziemliche Kombinatorischer Knoten kam IMHO auch ers später hinzu. Den größten Sprung machte IMHO der ARM6, weil in dem alles reingepresst wurde was Apple für den newton PDA brauchte.
Also "nichts verändert" ist ne ziemlich übermütige Ansage.
Also "nichts verändert" ist ne ziemlich übermütige Ansage.
Es ging dabei nicht um den gesamten Prozessor, sondern weshalb ADD reg,reg (scheinbar) nur einen Takt benötige. Und das ist im ARM1 genauso falsch oder genauso richtig wie beim A55, je nachdem, ob man den Gesamtablauf oder die Latenz betrachtet.
Die Frage war also, wie der Gesamtablauf eines Befehls bei AVR und ARM
in einem Takt möglich sei. Also mit allem Gedöns, angefangen mit dem
Fetch. ... Weil die Voraussetzung der Frage falsch ist: Das
dies alles in einem Takt geschähe.
Nein die Voraussetzung ist nicht falsch, klar kann man Eintaktmaschinen bauen und hat auch gebaut. Im einstelligen MHZ ist das seit den neunzigern kein Problem. Haben wir alles schon gestern durchgekaut: Beitrag "Re: 1 Befehl pro Zyklus"
Und der TO hat auch einen link auf Blockbild und Grundstruktur einer singlecyclemaschine gegeben.
Aber natürlich kann man eine Frage immer so umbiegen, das man sie mit dem eigenen Viertelwissen beantworten kann.
Wenn etwas an der Voraussetzung fehlerhaft ist, dann das sie keinen quantitiven Rahmen aka Taktdauer nennt.
Weil die latencies einfach auf den Ladebefehl davor resp. danach
geschlagen werden, siehe Anhang.
Ladebefehle bei ARMs sind wieder eine andere Baustelle, weil da die dokumentierte Latenz grösser als 1 ist, sie somit überhaupt nicht in den Thread passen. Und inweit man da auf eine Durchsatz von 1 käme, erst recht.
Weil die latencies einfach auf den Ladebefehl davor resp. danach
geschlagen werden, siehe Anhang.
Ladebefehle bei ARMs sind wieder eine andere Baustelle, weil da die
dokumentierte Latenz grösser als 1 ist, sie somit überhaupt nicht in den
Thread passen.
Nein das ist die selbe Baustelle, weil eben Register und ALU in der selben Pipeline stecken.
Das war aber nicht die Frage. Es gab nie einen RISC Prozessor, der den
gesamten Ablauf ein einem Takt erledigt hätte.
Doch das ist die Frage, folge einfach dem Link, der in dem allerersten Post mitgegeben wird.
Kann sein. Ich kenne allerdings keinen. Beispiel?
Wurden schon mehrmals genannt.
Wenn Du Deine Sonnenbrille beim Lesen nicht absetzen willst, weil Du ohne deren Coolness-Faktor nicht ernst genommen wird kann ich Dir leider auch nicht weiterhelfen.
Herrje, krieg bitte die Fakten gerade, wenn schon nicht die Ansichten.
Thumb kam mit ARM7T(DMI), und damit lange nach ARM1.
Fakt ist, du hast behauptet es wäre diesbezüglich alles gleich von ARM1 bis ARM55. Ist es nun aber nicht. Also hat rbx schon recht, wenn er daraufbesteht das das konkrete ARM-Modell genannt wird wenn man über Architektur-spezifica spricht.
Eine 1-Stufen-Pipeline macht genauso wenig Sinn zu erwähnen wie eine Autoschlange bestehend aus nur einem Auto.
Der AVR hat (auch wenn hier das jemand nicht wahr haben will) eine 2-Stufen-Pipeline. (beim XMEGA kann es wohl nicht anders sein)
Ein ST62 schafft 13 Befehle per Takt.
Wohl eher nicht.
Ein DSP ist kein universeller RISC-Mikrocontroller. Und darum geht es
hier in dieser Diskussion.
Es können in 'MCU's auch DSP-Funktionalit. mit eingebaut sein, wie auch in 'DSP's General-Purpose-Funktionalit. mit eingebaut sein kann.
Nur, als 'MCU' verkauft es sich besser.
Ein Takt per Befehl ist ein alter Hut.
Das konnten die DSPs schon lange bevor jemand R.I.S.C.
ueberhaupt buchstabieren konnte.
DSP bedeuted nicht zwangsläufig, dass jeder Befehl in einem Takt ausgeführt wird.
Es weisst auf mehrere Busse hin.
Sieht man ja, dass es mehr Takte braucht um einen Zyklus auszuführen,
also werden intern mehr Taktflanken inerhalb eines Taktes erzeugt oder
nicht?
Sieht man ja, dass es mehr Takte braucht um einen Zyklus auszuführen,
also werden intern mehr Taktflanken inerhalb eines Taktes erzeugt oder
nicht?
Ziemlich sicher nicht. Dazu bräuchte man eine PLL.
Doch. Nein.
PLL ist nur eine Variante der Implementierung eines Maschinen-Zyklusgenerators.
Andere sind DLL (delay looked loop) und bei vorgegebenen Takt-Tastverhältniss 1:1 resp. duty cycle 50% einfache Inverter.
In der ARM-Historie ist das sehr gut erkennbar, anfangs wurden extern zwei nicht überlappende Rechtecksignale φ1 und φ2 erzeugt und eingespeist. Irgendwannführte man dann mehrere clock domains ein, eine für das Speicher subsytem eine ander für den Processing-Core. Siehe auch, den Pirsch-Auszug im Anhang.
Im AVR Blockbild heisst es gleich vielsagend clock circuit/clock generation.
Da bei der Einführung des Thumb Codedichte im Fokus war, musste halt der Zoo an Instructionen eingedampft werden, Da mussten halt die bits für conditional execution dran glauben.
Vielleicht habe ja die deutschen ein Problem damit, weil es bei Daumen keine extra Pluralform gibt: der Daumen, die Daumen, zwei linke Hände und rings nur Daumen ...
Nein. Du hast nur keine Ahnung von Arm.
Aber wen wundert es, nach dem ganzen Quatsch, den du hier bereits abgelassen hast.
Thumb-2 ist gar kein eigener Befehlssatz.
Da bei der Einführung des Thumb Codedichte im Fokus war, musste halt der
Zoo an Instructionen eingedampft werden, Da mussten halt die bits für
conditional execution dran glauben.
Du wirst es kaum glauben, aber trotzdem hat Thumb conditional execution. (IT-Instruktion).
Lies und verstehe doch einmal zur Abwechslung meine Beiträge und die Links, die ich poste.
Lies und verstehe doch einmal zur Abwechslung meine Beiträge und die
Links, die ich poste.
Soso und eigene Recherche und Links wie oben reicht nicht, es muß immer über den Informationsmonopolisten MaWin laufen?! Der bis jetzt kein einziges Fachbuch zu dem Thema aus seiner Handbibliothek ziehen konnte?!
Als ganz nach dem erstes Gebot: DU SOLLST NICHT ANDERE MaWins HABEN NEBEN MIR! ICH BIN DER HERR, DEIN MaWin. SCNR
Thumb-2 ist gar kein eigener Befehlssatz.
Es gibt Thumb, Thumb2, ThumbEE (inzwischen eingestellt) und auch die Unterschiede zwischen diesen. So wie es eben nicht "den" ARM-Prozessor gibt, sondern einen über Jahrzehnten gewachsenen Dschungel.
Man hat keine Read-Modify-Write-Befehle auf's RAM, würden
den Datenbus zweimal benutzen.
Wobei man eine Pipeline auch darauf einrichten kann. Cyrix's M1/M2 Prozessoren der x86 Szenerie taten dies, während Intels Pentium zwar mit Load-Execute klar kam, aber bei Load-Execute-Store ins Stocken kam.