Hallo,
ich kämpfe mich mal wieder durch die Microchip-Dokumentation vom PIC32
und suche die Zeit, die benötigt wird, um z.B. ein NOP (in Assembler)
abzuarbeiten. Wer weiß, wo ich diese Angabe finde und wie lang diese
Zeit bei einem z.B. 80MHz-Takt ist?
Gruß Mirko
Hallo,
ich bin in der Materie noch nicht so drin, aber aus (vieeel) früheren
Assembler-Versuchen meine ich mich zu erinnern, daß ein NOP einen Takt
lang nichts tut.
Wenn das Ding nun 80 MHz hat sind das 80 Millionen Takte pro Sekunde.
Ein NOP, wenn es tatsächlich einen Takt lang nichts tut, vertrödelt also
eine achtzig-millionstel Sekunde :)
42m
Mirko G. schrieb:> ich kämpfe mich mal wieder durch die Microchip-Dokumentation vom PIC32> und suche die Zeit, die benötigt wird, um z.B. ein NOP (in Assembler)> abzuarbeiten. Wer weiß, wo ich diese Angabe finde und wie lang diese> Zeit bei einem z.B. 80MHz-Takt ist?
Microchip hat den Core nicht erfunden sondern eingekauft. Kann also
sein, dass diese Information nicht in der Controller-Dokumentation zu
finden ist, sondern in einer separaten Referenz des Cores. Die bei MIPS
zu suchen wäre, aber vielleicht von Microchip auch mehr oder weniger
angepasst durchgereicht wird.
Hallo,
ich musste mich auch mal kurz mit diesem Thema beschäftigen. Nach meiner
Erfahrung kann nicht 100% bestimmt vorrausgesagt werden, wie viel Zyklen
ein Assemblerbefehl beansprucht.
Google mal nach "SystemConfigPerformance()" und schau dir das hier an:
http://www.microchip.com/forums/m404723-print.aspx
Genau verstanden was da passiert habe ich nicht, vielleicht trägt diese
Diskussion ja zur Aufklärung bei.
P.s. Simulator und Demo-Board (Explorer 16) ergaben bei mir
unterschiedliche Laufzeiten.
Thomas schrieb:> Ich glaube bei den alten PICs braucht ein Befehl 4 Taktzyklen. Also> 4/(80e6).
der PIC32 ist aber nicht alt. Soweit ich weiß, haben die dsPICs diesen
Teiler nicht, warum sollten dann die PIC32 einen haben. Im Schaltbild
vom Oscillator ist jedenfalls kein fester Teiler eingezeichnet, daher
hätte ich gesagt, ein Takt-Zyklus = 12,5ns
Loonix schrieb:> Die teilen den Takt im Gegensatz zum PIC32 aber immer noch durch 2.
Sorry für die ungelenke Ausdrucksweise. Ich meinte, ein dsPIC braucht
immer noch zwei Taktzyklen um eine Instruktion auszuführen.
Loonix schrieb:> Sorry für die ungelenke Ausdrucksweise. Ich meinte, ein dsPIC braucht> immer noch zwei Taktzyklen um eine Instruktion auszuführen.
Nur die PIC24F. Die dsPIC30/33 und PIC24H nicht.
Stefen schrieb:> Der PIC32 hat eine 5 Stufige Pipline,ich denke wenn keine Sprünge da> sind dann fosc = fcycle! also die Ausführungszeit auch mit 80MHz.
Bischen komplizierter wirds schon noch, da Abhängigkeiten zwischen
verschiedenen Stufen der Pipeline auftreten können, z.B. wenn ein
ALU-Ergebnis als Adresse des darauf folgenden Lade/Speicherbefehls
verwendet wird. Auch kann die Laufzeit von Lade/Speicherbefehlen
abhängig von der Adresse sein, diese Zeit sich aber anderseits in davon
unabhängigen Folgebefehlen verstecken.
Die Aussage oben, dass es mit einfachem Taktzählen nicht getan ist
stimmt durchaus. Ich würde vom Versuch abraten, mit Prozessoren dieser
Klasse unbedingt ein taktgenaues Befehlstiming hinbekommen zu wollen.
A. K. schrieb:> Nur die PIC24F. Die dsPIC30/33 und PIC24H nicht.
Bist du dir sicher? Ich habe seit gut 2 Jahren keinen dsPIC mehr
benutzt, glaube aber mich erinnern zu können dass Fcy = Fosc/2
Master Snowman schrieb:> PIC24F/H, dsPIC: Fcy = Fosc/2
Wer hat jetzt recht? Werd doch nochmal in die Datenblätter schauen.
Loonix schrieb:> Master Snowman schrieb:>> PIC24F/H, dsPIC: Fcy = Fosc/2>> Wer hat jetzt recht? Werd doch nochmal in die Datenblätter schauen.http://ww1.microchip.com/downloads/en/DeviceDoc/70186D.pdf
Ist noch ein "durch 2" Teiler noch vor (siehe Seite 2). Doch Fcy ist
Fosc/2... Fosc ist aber nicht zwingend die Frequenz vom Oscillator, ob
intern oder extern.
Immerhin, das oben erwähnte Problem mancher Pipelines, nämlich die
Bremse zwischen ALU-Ergebnis und Adressrechnung im Folgebefehl, die hat
MIPS offenbar vermieden. Macht es ein bischen einfacher.
Master Snowman schrieb:>> Ist noch ein "durch 2" Teiler noch vor (siehe Seite 2).> du meinst wohl seite 7-19
ne.. 7-2.. In der Zeichnung auf der rechten Seite ist Fosc. Dann geht
die "Leitung" in eine Box "/2" und dann nach Fp, über den Teiler dann
auf Fcy.. Da sieht man immer gut, wie was zusammenhängt. Und auch wenn
da der Takt noch durch 2 geteilt wird, kann man ihn vorher per PLL
erhöhen und somit kann man mit einem 40MHz Quarz auch Fcy=40MHz haben.
Doch beim PIC32 bin ich mir nicht sicher, doch wenn ich das jetzt
richtig verstanden habe, kann die "Fcy" schwanken bzw variieren.
Master Snowman schrieb:> PIC10..18: Fcy = Fosc/4> PIC24F/H, dsPIC: Fcy = Fosc/2> PIC32: Fcy = Fosc (pipeline: siehe beitrag von A.K.)dsPIC:
The system clock source is divided by four to produce the internal
instruction cycle clock, FCY.
"probieren geht über studieren", also:
mach eine Schleife und toggle einen Pin, die Zeiten kannst Du mit einem
Oszi oder LA messen. Dann mach einen oder mehrere NOPs in die Schleife
und miss wieder ...
... und dann verschiebe den gesamten Code der Schleife 1-3 Worte nach
hinten und miss nochmal. Vielleicht ändert sich nichts, vielleicht doch,
je nach exaktem Aufbau von Instruction Fetch Puffern und dem
Flash-Interface.
Das Verschieben kann natürlich auch ändern, wichtig ist aber der
Unterschied mit NOP und ohne NOP an der gleichen Stelle im Programm. Am
besten in Assembler.
Aja, erst global postulieren und dann mit Spezialitäten daherkommen...
In diesem Sinne:
still wrong:
Section 07. Oscillator - dsPIC33F FRM
Figure 7-2
regarding the topic
FCY dsPIC30 FCLK/4
FCY dsPIC33 FCLK/2 (also for PIC24F/H/EP)
morph1 schrieb:> Aja, erst global postulieren und dann mit Spezialitäten daherkommen...> In diesem Sinne:>> still wrong:> Section 07. Oscillator - dsPIC33F FRM> Figure 7-2>> regarding the topic>> FCY dsPIC30 FCLK/4> FCY dsPIC33 FCLK/2 (also for PIC24F/H/EP)
... dann ist's wohl halfwrong / halfright. Der unterschied zwischen den
dsPICs war mir nicht bekannt, habe nur mit den 30'ern zu tun gehabt.
Danke.