2

运行裸机(无操作系统,无 Linux)

规格表明 ARM 可以/确实运行 700MHz,系统时钟与手册相匹配,并且似乎以 250MHz 运行。ARM 上的简单测试表明它正在做同样的事情,例如指令缓存打开

test:
  subs r0,r0,#1
  bne test

并且改变 subs 指令的数量来控制分支,它在 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

每个函数的系统计时器以十六进制计时(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 可能会弄乱管道,因为您必须在执行下一条指令之前等待一条指令的一个结果。我期待看到测试 2 和 3 之间的差异,这可能是另一个错误的假设。也许它真的是 500Mhz 而不是 700?linux 源代码中有一行提到了 500000000 时钟。

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.img arm boot的fat分区文件。所以不在 boot/ 目录中,而是在与 .bin 和 .elf 和 .img 文件相同的目录中创建 config.txt 并放置 arm_freq=something,然后 gpu 引导加载程序对 pll 乘数进行修改,以便在 arm 启动时就是这样的速度。我仍然预计每秒有超过 7 亿条指令,但我没有看到,我猜需要继续尝试。

4

5 回答 5

2

可能值得从 Raspberry Pi 组织的下载页面查看 Arch Linux 参考发行版提供的引导加载程序。我不知道它是否是一个工作选项,但它的 config.txt 包含该行

#arm_freq=800

也有报道称人们对 Pi 进行了超频 - 因此有关初始化时钟的信息肯定在某处。

于 2012-06-05T20:49:08.620 回答
2

可能是因为 Raspberry Pi Foundation 主要由 Broadcom 员工组成,他们选择了 Broadcom 设备作为 CPU。虽然这意味着 RPi 以非常低的成本获得了相对高性能的 ARM11,但不幸的是,博通只向被许可方提供了芯片的全部细节,因此设置 PLL 所需的信息可能不会公开,我怀疑是嵌入在 Broadcom 提供的“固件”二进制文件中。

于 2012-06-05T16:27:18.573 回答
0

我对裸机编程了解不多,但这段代码可能有用: https ://github.com/dwelch67/raspberrypi

值得注意的是描述引导顺序的自述文件部分:

1) 从某种片上 ROM 启动
2) 读取 sd 卡并在第一个分区的根目录中查找其他特定于 gpu 的启动文件 bootcode.bin、loader.bin、start.elf(FAT 格式)
3
( _文件并将其复制到内存
5) 释放 arm 上的重置,使其从写入 kernel.img 数据的地址运行

这意味着 config.txt 与 linux 内核是分开的,并且芯片自己设置时钟速度(只要这个序列实际上是真的。)

该存储库中的代码可能会帮助您回答您的问题。

另外,在树莓派网站上,他们发了一篇关于官方超频的帖子:http ://www.raspberrypi.org/archives/2008

他们提到了一个 cpufreq 驱动程序,您应该能够获得源代码(因为它是 linux 源代码树的一部分。)这也可能有所帮助。

于 2012-09-27T03:37:42.947 回答
0

您可以调整 Raspberry Pi 并更改例如 ARM 时钟速度和 Ram/Video Ram。一个很好的教程

于 2013-08-15T13:40:37.590 回答
0

我知道这是不久前被问及回答的,但我遇到了这个问题,希望能得到一个快速的答案。万一其他人可能想知道这就是我为裸机设置修复它的方式。我通过添加在 RPI3 上取得了成功

force_turbo=1
arm_freq=1200

同样,即使这是裸机,在启动 ARM 并加载裸机代码(据我了解)之前,GPU 固件也会读取 config.txt。我发现这里引用了这个。请注意,我还尝试以编程方式更改频率,但找不到参考(我什至查看了 linux 内核源代码树,但我是内核开发的新手)。

于 2017-07-12T19:18:03.363 回答