Hallo,
wenn das gleiche Prg. einmal mit der THUMB-Option und einmal mit der
ARM-Option compiliert wird, ist trotz gleichem
startupfile(Plleinstellungen usw) der Prozessortakt unterschiedlich.??
Meine Konfiguration:
Hardware: AT91SAM7S64 Olimex
Software: Eclipse bzw. Keil
Compiler: GNU-Compiler Keil-ARM-Compiler
bin gespannt auf die Antworten
Gruss
nik
Leider nicht. Bin gerade am Messen. Wenn ich im THUMB-Mode compiliere
läuft der uC mit 48 MHz im ARM-Mode nur mit 26MHz. Gemessen habe ich
single-cycle-Befehle.
Gruss
nik
Dominique,
wie schnell der Prozessor laeuft in MHz laesst sich nur bedingt in der
Ausfuehrungszeit eines Befehles messen.
Wenn Du denselben Code aus dem RAM ausfuehrst, dann sollte sich keine
solchen Unterschiede mehr ergeben. Es koennte sich um die Verzoegerung
im Flashzugriff des SAM7 handeln. Der interne Bus ist 32-bit breit, das
reicht um immer 2 Thumb Befehle zu holen, somit laeuft der Chip als ob
keine Waitstates da waeren. Im ARM mode sind die Befehle aber 32-bit
breit, da muss er dann warten nach jedem Befehl.
Ist eine laengere Geschichte.
Du kannst den Takt messen in dem du einen Timer hernimmst und nach 1000
Timer Incrementen einen Pin umschaltest aber nicht in der
Ausfuehrungszeit eines Befehles.
Robert
Den folgenden Code ins Programm einfügen(singlecycle)
1
m_pPio->PIO_SODR = CpuTakt; //CpuTakt ein
2
__asm{
3
mov r0,#0fH ; //1 Takt
4
mov r0,#0fH ; //1 Takt
5
mov r0,#0fH ; //1 Takt
6
mov r0,#0fH ; //1 Takt
7
mov r0,#0fH ; //1 Takt
8
mov r0,#0fH ; //1 Takt
9
mov r0,#0fH ; //1 Takt
10
mov r0,#0fH ; //1 Takt
11
mov r0,#0fH ; //1 Takt
12
mov r0,#0fH ; //1 Takt 10
13
mov r0,#0fH ; //1 Takt
14
mov r0,#0fH ; //1 Takt
15
mov r0,#0fH ; //1 Takt
16
mov r0,#0fH ; //1 Takt
17
mov r0,#0fH ; //1 Takt 15
18
mov r0,#0fH ; //1 Takt
19
mov r0,#0fH ; //1 Takt
20
mov r0,#0fH ; //1 Takt
21
mov r0,#0fH ; //1 Takt
22
mov r0,#0fH ; //1 Takt 20
23
}
24
m_pPio->PIO_CODR = CpuTakt; //CpuTakt aus
Die Zeit von CpuTakt an bis aus messen.
Dann das Gleiche nochmal mit nur 15 mov-Befehlen.
Dann die Zeitdifferenz berechnen. Diese durch 5 teilen und davon der
Kehrwert. Dabei kommt ganz genau die Cpufrequenz raus.
Das mit dem Timer werd ich mal probieren.
Gruss
nik
Nik,
da kommt nicht die CPU Frequenz raus sondern ein Wert der berechnen
laesst wieviel Zyklen ein Befehl tatsaechlich braucht.
Mach dieselbe Sequenz in einem STR7 bei gleicher Frequenz, Du wirst
einen anderen Wert bekommen, mach es mit einem NXP gleiche Frequenz, Du
bekommst wieder einen anderen Wert. Es ist zwar grundsaetzlich richtig,
dass es dieselbe CPU ist, doch die Leistungsfaehigkeit beruht SEHR stark
darauf, wie der Speicher angeschlossen ist. Beim SAM7 ist die Anbindung
optimiert auf Thumb mode.
Alle die CPUs wuerden gleich schnell laufen in MHz aber gemaess deiner
Messmethode muessten alle Takte unterschiedlich sein, sie sind es nicht.
Ach ja, noch ein Wert, der nicht vielen gelaeufig ist, der ARM7 hat ein
CPI von 1,9. CPI sthet fuer Clocks Per Instruction und gilt bei
optimaler Anbindung, also z.B. Ausfuehrung aus einem 0 Waitstates SRAM.
Das alles ist etwas komplexer als es z.B. bei einem AVR ist, allerdings
wuerden sich viele wundern wenn sie ein Beispielprogramm auf dem AVR
ablaufen lassen, sagen wir mal mit 10 MHz und 100 Befehlen. Es besteht
ja oft die Meinung der AVR ist ein single cycle core. Dann muesste ein
solches Programm idealerweisse in 10 usec abgearbeitet sein, kannst ja
mal testen ;-)
Robert Teufel
Robert,
Die Richtigkeit der Messung:
Einstellungen:
1
pPMC->PMC_PLLR=((AT91C_CKGR_DIV&14)|
2
(AT91C_CKGR_PLLCOUNT&(10<<8))|
3
(AT91C_CKGR_MUL&(72<<16)));
f(Quarz) = 18,432MHz
DIV = 14 (Vorteiler)
MUL = (73-1) = 72
f(Prozessor) =18,432MHz/14*73= 96,109MHz
f(Prozessor)/2=48,0545 MHz
Der Prozessor müsste also mit 48,0545 MHz laufen.
Die Messung:
Tp = (M1-M2)/B
fp =1/Tp = B/(M1-M2)
Tp : ein Prozessortakt
fp : die Frequenz des Prozessors
M1 : Zeit für 20 mov-Befehle plus der Befehle, die zum Schalten an PA2
dienen
M2 : Zeit für 15 mov-Befehle plus der Befehle, die zum Schalten an PA2
dienen
B : Anzahl der Differenz der mov-Befehle hier 5
gemessen wurde in der Eclipseumgebung:
M1=688,4 ns
M2=584,4 ns
fp = 5/(688,4ns-584,4ns)= 48,0769MHz
Wie Du siehst ist das Verfahren recht plausibel.
Wo Du vermutlich recht hast, ist
1
Beim SAM7 ist die Anbindung
2
optimiert auf Thumb mode.
und
1
Es koennte sich um die Verzoegerung
2
im Flashzugriff des SAM7 handeln.
Deswegen würde ich gerne zum Vergleich, auch mit dem Timer den Takt
vermessen.
Ich vermute Du hast das schon mal gemacht. Ich muss mich da erst
reinarbeiten. Vielleicht hast du da ein paar Tipps für mich, oder am
Besten
ein wenig Programmcode.....
Dank und Gruss
nik
Ja so, dann schaut mal bei den Analog Device ARM7 CPUs die haben nur
eine 16Bit Flash Anbindung. Da ist thumb auch etwas schneller, aber bei
gut programmiertem ARM-Code dürfte es schnell kompensiert sein, da der
Thumb-Mode
halt oft zwei Befehle braucht umn das selbe zu tun.