2

ベアメタルの実行(オペレーティングシステムなし、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億以上の命令を期待していて、それを見ていません、私が推測することを試み続ける必要があるでしょう。

4

5 に答える 5

2

RaspberryPi組織のダウンロードページからArchLinuxリファレンスディストリビューションに付属しているブートローダーを確認する価値があるかもしれません。それが機能するオプションかどうかはわかりませんが、そのconfig.txtには次の行が含まれています

#arm_freq=800

人々がPiをオーバークロックしたという報告もあります-したがって、時計の初期化に関する情報は確かにどこかにあります。

于 2012-06-05T20:49:08.620 に答える
2

おそらく、Raspberry Pi Foundationが主にBroadcomの従業員で構成されているという事実のために、彼らはCPUとしてBroadcomデバイスを選択しました。これは、RPiが非常に低コストで比較的高性能のARM11を取得することを意味しますが、残念ながらBroadcomはチップの完全な詳細のみをライセンスに提供するため、PLLをセットアップするために必要な情報は公開されていない可能性があります。 Broadcomが提供する「ファームウェア」バイナリに埋め込まれています。

于 2012-06-05T16:27:18.573 に答える
0

ベアメタルプログラミングについてはよくわかりませんが、次のコードが役立つ可能性があります: https ://github.com/dwelch67/raspberrypi

注目すべきは、起動順序を説明するreadmeの一部です。

1)ある種のオンチップROMから起動します
2)sdカードを読み取り、最初のパーティションのルートディレクトリで追加のgpu固有のブートファイルbootcode.bin、loader.bin、start.elfを探します(ファットフォーマット)
3 )同じディレクトリでconfig.txtを検索します。これにより、アーム速度をデフォルトの700MHzから変更したり、kernel.imgをロードするアドレスを変更したりできます
。4)kernel.imgを読み取ります。アームブートバイナリファイルを作成してメモリにコピーします
。5)kernel.imgデータが書き込まれたアドレスから実行されるように、アームのリセットを解放します。

config.txtがLinuxカーネルから分離されており、チップがクロック速度自体を設定することを意味します(このシーケンスが実際に真である限り)。

そのリポジトリのコードは、質問に答えるのに役立つ場合があります。

また、Raspberry PiのWebサイトで、公式のオーバークロックに関する投稿を行いました:http ://www.raspberrypi.org/archives/2008

彼らは、ソースを取得できるはずのcpufreqドライバーについて言及しています(これはLinuxソースツリーの一部であるためです)。これも役立つ場合があります。

于 2012-09-27T03:37:42.947 に答える
0

Raspberry Piを調整して、たとえばARMクロック速度やRam /VideoRamを変更できます。良いチュートリアル

于 2013-08-15T13:40:37.590 に答える
0

私はこれが少し前に尋ねられて答えられたことを知っています、しかし私は迅速な答えを得ることを望んでこの質問に出くわしました。他の誰かが知りたいと思うかもしれない場合に備えて、これは私がベアメタルセットアップのためにそれを修正した方法です。追加することでRPI3で成功しました

force_turbo = 1
arm_freq = 1200

繰り返しになりますが、これはベアメタルでしたが、ARMを起動してベアメタルコードをロードする前に、config.txtがGPUファームウェアによって読み取られます(私が理解していることから)。私はこれがここで参照されているのを見つけました。プログラムで頻度を変更しようとしましたが、参照が見つかりませんでした(Linuxカーネルのソースツリーを見回したこともありますが、カーネル開発の初心者です)。

于 2017-07-12T19:18:03.363 に答える