embedded - 树莓派上的 ARM 时钟速度

标签 embedded arm low-level raspberry-pi

运行裸机(无操作系统,无 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?

编辑2...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启动文件和内核的fat分区。 img ARM 启动文件。因此,不是在 boot/目录中,而是在具有 .bin、.elf 和 .img 文件的同一目录中创建 config.txt 并放置 arm_freq=something,然后 GPU 引导加载程序对 pll 乘数进行修改,以便在arm启动时就是这样的速度。我仍然期望每秒超过 7 亿条指令,但我没有看到这一点,我想需要继续尝试。

最佳答案

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

#arm_freq=800

也有报道称人们对 Pi 进行了超频 - 因此有关初始化时钟的信息肯定就在那里,在某个地方。

关于embedded - 树莓派上的 ARM 时钟速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10883083/

相关文章:

node.js - 用于 Raspberry Pi ARM 的 Mongodb MongoClient.connect() 上的总线错误

arm - 哪个时钟源用于 cortex-M4 中的时钟指令

c - C 中与网络相关的低级软件的读物、工具和库

c - 提高读取 volatile 存储器的性能

embedded - 为什么我的代码在使用 Realview 工具构建时表现不佳,但使用 Codesourcery 构建时表现更好?

linux - 可视化 Linux 内核使用的设备树文件 (dtb) 的工具?

c - 将 32 位整数移动 32 位

variables - 如何访问堆栈上的变量?

algorithm - 如何使用定点算法在正弦查找表 (LUT) 中查找偏移量

embedded - 复位时嵌入式系统会发生什么?