ベアメタルの実行(オペレーティングシステムなし、Linuxなし)
仕様は、ARMが700MHzを実行できる/実行することを意味し、sysクロックはマニュアルと一致し、250MHzで実行されているように見えます。ARMでの簡単なテストは、同じことを実行していることを意味します。たとえば、命令キャッシュをオンにします。
test:
subs r0,r0,#1
bne test
そして、ブランチを支配するためにサブ命令の数を変えてください、それは250MHzの球場にありますが、700MHzから遠く離れています。
ARMクロックを乗算するためのデータシートに表示されていないphy設定はありますか?
編集:
多分私の仮定には欠陥があります...
.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
システムタイマーは機能ごとに16進数で刻みます(ストップウォッチなどに対して検証された250Mhzシステムタイマー)。
02DB6DF7 ARMTEST0
02DB6E1C ARMTEST0
00AB6E2A ARMTEST1
00836E46 ARMTEST2
00836E2A ARMTEST3
これは次のようになります。
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
ARM11はスーパースカラーであり、クロックごとに複数の命令が予期されていません。でももっと期待します。レジスタ0のみを使用すると、次の命令を実行する前に1つの命令の結果を待つ必要があるため、パイプが混乱する可能性があります。私は、テスト2と3の間に違いが見られることを期待していました。おそらく、別の悪い仮定です。たぶん、700ではなく本当に500Mhzですか?Linuxソースには、500000000クロックについて言及している行が1つあります。
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
たぶん、250Mhzが270で、ARMが500MHzであると私が測定したと思いますか?
EDIT2 ... DOH
それはパイプラインの大きな改善ではありませんでした、これはより良いです:
.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
最初はconfig.txtを機能させることができませんでした。次に、Linux SDカードを再構築し、それを起動して、/boot/ディレクトリが実際にはgpuブートファイルとkernel.imgarmbootを含むファットパーティションであることを確認しました。ファイル。したがって、boot / dirではなく、.binおよび.elfおよび.imgファイルと同じdirでconfig.txtを作成し、arm_freq = somethingを配置すると、gpuブートローダーがpll乗数に変更を加えて、アームが起動したときにそれはその速度です。私はまだ毎秒7億以上の命令を期待していて、それを見ていません、私が推測することを試み続ける必要があるでしょう。