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
Für den Prozessortak ist das Programm bzw. dessen Initialisierung zuständig. Ob die in Thumb- oder ARM-Mode erfolgt, ist unerheblich.
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
Wie gemessen? AT91SAM7 sind im Thumb-Modus zum Teil schneller, weil das Speicherinterface dann nicht so limitiert.
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
1 | Wie gemessen? |
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.
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.