Forum: Mikrocontroller und Digitale Elektronik AVR Befehle mit mehreren Takten, Stall oder Parallelberechnung


von Dussel (Gast)


Lesenswert?

Moin,

ich habe eine kurze Frage, die ich durch Suchen und Lesen im Datenblatt 
nicht beantworten konnte.
Wie werden im AVR Befehle, die mehrere Takte dauern, zum Beispiel mul 
und sbiw ausgeführt?
Läuft die Pipeline während der Berechnung weiter und der Multiplizierer 
arbeitet parallel oder wird sie für einen Takt angehalten? Gibt es einen 
Stall?
Instinktiv habe ich, als ich noch Assembler programmiert habe, immer
mul r16,r17
nop          ; Warte auf Ergebnis
mov r16,r0
mov r17,r1
geschrieben. Das nop könnte man natürlich auch durch eine andere 
Operation ersetzen. Bringt das was oder wird erst auf das Ergebnis 
gewartet und dann der nächste Befehl ausgeführt?
Mir kommt es nicht auf die paar Takte an, ich würde nur gerne die 
Funktionsweise kennen. Im Datenblatt habe ich nur die Ausführung von 
'1-Takt-Befehlen' gefunden.

von holger (Gast)


Lesenswert?

seit wann habe AVR's eine Pipeline ?

von (prx) A. K. (prx)


Lesenswert?

Die Takte aufeinander folgender Befehle darf man bei AVRs exakt so 
addieren, wie sie in der Doku stehen.

von (prx) A. K. (prx)


Lesenswert?

holger schrieb:
> seit wann habe AVR's eine Pipeline ?

Haben sie, aber eine sehr einfache 2stufige: fetch/execute.

von Peter D. (peda)


Lesenswert?

Dussel schrieb:
> Instinktiv habe ich, als ich noch Assembler programmiert habe, immer
> mul r16,r17
> nop          ; Warte auf Ergebnis

Warum?
Steht das so im Datenblatt?
Im allgemeinen ist dem Datenblatt zu folgen, besser als jeder Instinkt.

Ich wüßte keinen MC, wo das Ergebnis eines Befehls nicht für den direkt 
nachfolgenden Befehl gültig ist.

Es gibt beim AVR Wartezeiten, z.B. beim Zugriff auf asynchrone Timer.
Aber alle RAM oder Registerzugriffe sind direkt nach Befehlsende gültig.

von Dussel (Gast)


Lesenswert?

holger schrieb:
> seit wann habe AVR's eine Pipeline ?
Seit 1996, wenn ich richtig informiert bin.

Peter D. schrieb:
> Warum?
> Steht das so im Datenblatt?
Nein. Ich habe damals, das ist ja auch schon ein paar Jahre her, 
gelesen, dass der Befehl zwei Takte braucht, also habe ich mir gedacht, 
dass im nächsten Takt=nächsten Befehl das Ergebnis noch nicht da sein 
kann. Das habe ich dann ohne drüber nachzudenken später immer so 
gemacht.
Jetzt frage ich mich halt, ob nächster Takt=nächster Befehl richtig ist.

Peter D. schrieb:
> Ich wüßte keinen MC, wo das Ergebnis eines Befehls nicht für den direkt
> nachfolgenden Befehl gültig ist.
Ich kenne nur den AVR ganz gut. Sonst nur verschiedene Prozessoren mal 
kurz im Studium und Cortex irgendwas auf einem SoC, wobei der nur 
Beiwerk für die Kommunikation war.

Peter D. schrieb:
> Aber alle RAM oder Registerzugriffe sind direkt nach Befehlsende gültig.
Das beantwortet dann meine Frage eindeutig, nachdem ich den Beitrag 
geschrieben habe.

Danke

von uwe (Gast)


Lesenswert?

> Ich wüßte keinen MC, wo das Ergebnis eines Befehls nicht für den direkt
> nachfolgenden Befehl gültig ist.
Normalerweise kümmern sich moderne CPUs um solche stalls in der Pipeline 
selber jedoch wude MIPS minimalistisch gebaut um transistoren zu sparen. 
Also muß man sich selber (bzw. der Compiler) um stalls und Pipeline 
Hazards kümmern.
Microprocessor without interlocked pipeline stages; deutsch etwa 
„Mikroprozessor ohne verschränkte Pipeline-Stufen"
https://de.wikipedia.org/wiki/MIPS-Architektur

von LostInMusic (Gast)


Lesenswert?

1
mul r16,r17
2
nop          ; Warte auf Ergebnis
3
mov r16,r0
4
mov r17,r1

Bitte lass das nop weg - es ist überflüssig. Auch bei allen anderen 
"Mehrtaktinstruktionen".

(Auf was für Ideen man alles kommen kann...)

von MCUA (Gast)


Lesenswert?

>..jedoch wude MIPS minimalistisch gebaut um transistoren zu sparen.
ARM eigentlich auch

>Also muß man sich selber (bzw. der Compiler) um stalls und Pipeline
>Hazards kümmern.
ja da ist MIPS die (schlechte) Ausnahme!
(wenigstens hat ARM sowas nicht)
Man muss bei manchen ASM-Befehlen tatsächlich aufpassen, ob das Ergebnis 
des vorigen Befehls überhaupt schon vorhanden ist (ggfs nop's einfügen).
(sowas bei AVR würde (bei den Leuten der Fangemeinde) wohl niemand 
hinnehmen)

von Bernd K. (prof7bit)


Lesenswert?

Dussel schrieb:
> Instinktiv habe ich, als ich noch Assembler programmiert habe, immer
> mul r16,r17
> nop          ; Warte auf Ergebnis
> mov r16,r0
> mov r17,r1

Also selbst wenn er mehrere Pipelines hätte wäre das nop in jedem 
Falle unsinnig, er würde dann auch ohne nop gezwungenermaßen warten. 
Sattdessen würde man auf so einem Prozessor in der Zeit lieber etwas 
anderes machen als Zeit mit einem vollkommen unsinnigen nop zu 
vertrödeln.

Insofern ist unklar warum Du (oder irgendwer) "intuitiv" nops irgendwo 
hinschreiben würde.

von (prx) A. K. (prx)


Lesenswert?

Intel hatte mit dem i860 mal einen Prozessor, dessen Pipeline offen 
sichtbar war - wenn Tempo gefragt war - und dann vom Programmierer 
berücksichtigt werden musste. Ohne Interlocks. Die Programmierung war 
selbst für Compiler so spassbefreit, dass er bald wieder von der 
Bildfläche verschwand.
https://en.wikipedia.org/wiki/Intel_i860#Performance_.28problems.29

von m.n. (Gast)


Lesenswert?

Die SH Prozessoren von Renesas brauchen vielfach ein NOP hinter Befehlen 
wie BSR oder BRA, da vor der gewünschten Verzweigung schon der nächste 
Befehl ausgeführt wird. Glücklicherweise weiß der Compiler, wann dies 
notwendig ist und wann nicht.

von Dussel (Gast)


Lesenswert?

Bernd K. schrieb:
> Sattdessen würde man auf so einem Prozessor in der Zeit lieber etwas
> anderes machen als Zeit mit einem vollkommen unsinnigen nop zu
> vertrödeln.
Lesen bildet:
Dussel schrieb:
> Das nop könnte man natürlich auch durch eine andere
> Operation ersetzen.
;-)

Manche AVR haben (zusätzliche) Timer, manche AVR haben USART, manche AVR 
haben ADC und manche AVR haben Hardwaremultiplizierer. Wegen dieser 
'Analogie' habe ich mir den Multiplizierer immer als eine Art 
Peripheriemodul vorgestellt, das parallel zum Kern arbeitet, so dass der 
Kern/die Alu während der Multiplikation parallel noch etwas anderes 
machen kann.

von Pandur S. (jetztnicht)


Lesenswert?

> Intel hatte mit dem i860 mal einen Prozessor, dessen Pipeline offen
sichtbar war

Er ist nicht deswegen verschwunden. Er war schief im Markt. Zur gleichen 
Zeit kam der 80386 raus. Am Intel Stand an der damalig angesagten Messe, 
ca 1985, wurde ich gefragt was ich denn mit der gigantischen 
Rechenleistung eines 386 wolle. Das war den Intelverkaeufern selbst 
nicht so klar. PCB Proogramme waren damals noch nicht so gut wie heute. 
Eigentlich gabe es keine. Worauf denn. Auch wenn diese wahnsinnig 
schnelle 386 Cpu mit 33MHz lief, war nicht mal schnell an ein Design zu 
denken. Einen Compiler gab es von Intel, zumindest auf dem Papier, zu 
einem Mondpreis. Es war mir etwas unklar worauf der haette laufen 
sollen. Ein Betriebssystem auf einem 386 gabs noch nicht. Nix Protected 
mode, das kam alles nachher von Microsoft, als Win95, dabei hatte sich 
das Win3.1 noch nicht mal so richtig etabliert. Das OS/2 von IBM kam 
auch dann auch auf dem 386. IBM hatten leider eine falsche Politik, dh 
nicht marktgerecht. Geschlossene Hardware, wie Apple damals auch schon, 
zu Mondpreisen. Wir sind IBM, und daher sowieso gut. Nur waren die 
damaligen IBM Kunden die Anwender von Grossrechnern, und die kleinen PCs 
waren fuer einfache Leute, in kleinen Firmen. Auch wenn fuer eine OS/2 
Maschine um die 10k abgedrueckt werden musste. Also der 386 kam grad 
vorher raus.

Der i860 auch. Der i860 war eigentlich ein hochparalleler DSP, ohne DSP 
interface. Dh man musste bei der Hardware alles zu Fuss machen. Der 
konnte auf Audiofrequenzen unten ein digitales Filter mit 500.Ordnung in 
Echtzeit rechnen. FFT, Matrizen, alles unwahrscheinlich schnell, mit 
hochparallelen MAC (multiply-accumulate), er war angelehnt an die 
Transputer, die waren damals auch draussen, oder angekuendigt. 
Heutzutage wuerde man den i860 mit GPU bezeichnen. Auch hier. PCB 
Programme gab's so eigentlich noch nicht. und der 860 lief glaub mit 60 
oder so MHz. Compiler auch nur von Intel. Auch hier war nicht wirklich 
klar, worauf der haette laufen sollen, auf einem DOS PC mit 640k eher 
nicht. Der Compiler hatte natuerlich auch einen Mondpreis. Die wenigen 
Firmen, die eine solche Entwicklung, dh i860 Hardware zum Markt bringen, 
haetten stemmen koennen waren nicht dran interessiert. Denn das Geld 
alleine genuegte nicht. Man musste auch die Leute haben. Die Leute, 
die's haetten machen koennen, waren junge Absolventen. Die 
Entscheidungstrager hatten vielleicht eine PDP 8, eine VAX auf der 
Bestellliste, und waren damit zufrieden. Die ambitioesen Absolventen 
gingen damals zu DEC, die bezahlten gut, waren ein technologisch 
orientiertes Startup, im Vergleich zu IBM, welche Grossrechner fuer 
Grossfirmen bauten.

Es ist immer noch unglaublich spannend, wie schnell und wieviel Momentun 
die PCs entwickelten, und innert kuerzester Zeit die Grossrechner 
ueberfluegelten.

ich selbst hab ein 8086 Sytem zusammengebaut bevor es den PC gab. Das 
386 Datenblatt war noch ein Stueck umfangreicher, hab ich auch gelesen. 
Das i860 Datenblatt hab ich auch gelesen. Beide, mangels Anwendung aber 
nicht gebaut. ich hatte ja nicht mal eine Anwendung fuer das 8086er 
system. Denn ohne OS, ohne Compiler wird's schwierig. Ich begann ein OS 
zu schreiben, aber mit Hex Code eintippen kommt man nicht so schnell 
vorwaerts. Als dann die PCs von urspruenglich 20k auf 4k runter kamen, 
hab ich dann einen solchen gekauft.

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
Noch kein Account? Hier anmelden.