ARM-Uhr die Geschwindigkeit auf dem raspberry pi

Laufen bare-metal (kein Betriebssystem, kein Linux)

Den Spezifikationen bedeutet, der ARM kann/läuft 700MHz, der sys-Uhr entspricht, das Handbuch und die scheint zu laufen bei 250MHz. Einfache versuche auf den ARM zu implizieren, dass es das gleiche tun, zum Beispiel mit dem instruction cache auf

test:
  subs r0,r0,#1
  bne test

Variieren und die Anzahl der subs Anweisungen Dominieren über den Zweig, es wird in der ball-park von 250MHz, aber ein langer Weg Weg von 700MHz.

Ich da ein phy-Einstellung, ich bin nicht zu sehen, in dem Datenblatt für die Multiplikation der ARM-Uhr?

EDIT:

Vielleicht meine Annahmen sind fehlerhaft...

.globl ARMTEST0
ARMTEST0:
    subs r0,r0,#1
    bne ARMTEST0
    bx lr

.globl ARMTEST1
ARMTEST1:
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    bne ARMTEST1
    bx lr

.globl ARMTEST2
ARMTEST2:
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    bne ARMTEST2
    bx lr

.globl ARMTEST3
ARMTEST3:
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    bne ARMTEST3
    bx lr

System-timer-ticks) in hex-pro-Funktion (250Mhz system-timer überprüft, gegen die Stoppuhr, etc).

02DB6DF7 ARMTEST0
02DB6E1C ARMTEST0
00AB6E2A ARMTEST1
00836E46 ARMTEST2
00836E2A ARMTEST3

Gibt:

ARMTEST0
0x01000000 subs instructions
0x01000000 bne  instructions
0x02000000 instructions
1.43 clocks per instruction.  175Mips.

ARMTEST1
0x01000000 sub instructions
0x00200000 bne instructions
0x01200000 instructions
1.68 instructions per clock. 420Mips

ARMTEST2
0x01000000 sub instructions
0x00100000 bne instructions
0x01100000 instructions
2.07 instructions per clock. 517Mips

ARMTEST3
0x01000000 sub instructions
0x00100000 bne instructions
0x01100000 instructions
2.07 instructions per clock. 517Mips

Der ARM11 ist super-Skalar-mehr als eine Instruktion pro Takt ist nicht unerwartet. Ich würde erwarten, mehr obwohl. Mit nur register 0 kann Chaos mit dem Rohr, da muss man warten, bis ein Ergebnis einer Anweisung vor der Ausführung der nächsten. Ich hatte erwartet, einen Unterschied zwischen test 2 und 3, vielleicht noch eine schlechte Annahme. Vielleicht ist es wirklich 500Mhz nicht 700? Es gibt eine Linie in den linux-Quellen, die erwähnt 500000000 Uhr.

static struct clk osc_clk = {
#ifdef CONFIG_ARCH_BCM2708_CHIPIT
    .rate = 27000000,
#else
    .rate = 500000000,  /* ARM clock is set from the VideoCore booter */
#endif
};

/* warning - the USB needs a clock > 34MHz */

#ifdef CONFIG_MMC_BCM2708
static struct clk sdhost_clk = {
#ifdef CONFIG_ARCH_BCM2708_CHIPIT
    .rate = 4000000,    /* 4MHz */
#else
    .rate = 250000000,  /* 250MHz */
#endif
};
#endif

Vielleicht, was ich glaube, ich habe gemessen als 250Mhz 270 und der ARM ist bei 500MHz?

EDIT2...DOH

Nicht eine große pipeline, die Verbesserung war es, das ist besser:

.globl ARMTEST3
ARMTEST3:
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    bne ARMTEST3
    bx lr


    ARMTEST3
    0x01000000 sub instructions
    0x08000000 nop instructions
    0x00100000 bne instructions
    0x09100000 instructions
    037000D7 system clocks
    2.64 instructions per clock. 659Mips

Ich es nicht config.txt die Arbeit auf den ersten, dann re-build eine linux-sd-Karte, gestartet wird, es zu finden, dass der /boot/- Verzeichnis ist in der Tat die fat-partition enthält, die gpu-Startdateien und den kernel.img-arm boot-Datei. Also NICHT in einem boot/dir aber in derselben dir mit der .bin ist und .elf und .img-Datei erstellen config.txt und setzen arm_freq=etwas, die gpu-bootloader macht dann die änderung der pll-Multiplikator, so dass, wenn der arm beginnt, ist es mit dieser Geschwindigkeit. Ich immer noch erwarten mehr als 700 Millionen Anweisungen pro Sekunde-und bin nicht zu sehen, dass, müssen immer wieder versuchen, denke ich.

  • Könnten Sie einen ähnlichen test durchführen, unter welcher die meisten offiziellen linux-kernel für den pi (eventuell hacken, den test in der kernel selbst). Überprüfen Sie auch die Anzahl der instruction cycles erforderlich, um die Ausführung von code. Und Lesen Sie über Ihre Geräte-spezifischen kernel-Initialisierung-code zu sehen, wenn Sie eine Neuprogrammierung einer pll-register.
  • Ich bin daran interessiert zu wissen, ob Sie Booten Sie Ihren test-code von der SD-Karte oder ob Sie JTAG ' ed es. Nicht um Ihnen Ihre Frage, die Sie verstehen, sondern weil ich mich Frage, ob Sie gefunden haben, Informationen über den bootloader.
  • Es gibt drei jtags, die gpu, den arm und den Netzwerk-chip. GPU, Nein, ich habe nicht alles gemacht, was mit der gpu. Netzwerk jtag, NÖ, arm jtag, ja, können und haben, sondern auch, um den arm-jtag-Sie müssen arm-code zu wechseln, gpio-pins, die ich verwenden Sie die sd-Karte zu Booten, das kleine Programm. Ich habe auch einen seriellen bootloader (arm beginnt auf sd-Karte) und eine jtag-Bootloaders (arm beginnt auf Karte).
InformationsquelleAutor old_timer | 2012-06-04
Schreibe einen Kommentar