运行裸机(无操作系统,无Linux)
规格意味着ARM可以/确实运行700MHz,系统时钟与手册相匹配,并且似乎以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
系统计时器每个功能以十六进制计算(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源代码中有一行提到了一个5亿个时钟。
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引导文件和内核的胖分区。 img arm启动文件。所以不是在boot / dir中,而是在.bin和.elf和.img文件的同一个目录中创建config.txt并输入arm_freq = something,然后gpu bootloader对pll乘数进行修改,以便在arm启动时它是在那个速度。我仍然期望每秒有超过7亿条指令,而且我没有看到它,我需要继续尝试。
答案 0 :(得分:2)
可能由于Raspberry Pi Foundation主要由Broadcom员工组成,他们选择了Broadcom设备作为CPU。虽然这意味着RPi以非常低的成本获得了相对高性能的ARM11,但遗憾的是Broadcom仅向许可证提供芯片的完整细节,因此设置PLL所需的信息可能无法公开获取,我怀疑是嵌入在Broadcom提供的“固件”二进制文件中。
答案 1 :(得分:2)
可能值得查看Raspberry Pi组织下载页面提供的Arch Linux参考发行版提供的引导加载程序。我不知道它是否是一个工作选项,但它的config.txt包含行
#arm_freq=800
还有报道称人们对Pi进行了超频 - 所以有关初始化时钟的信息肯定会出现在某处。
答案 2 :(得分:0)
我对裸机编程知之甚少,但这段代码可能有用: https://github.com/dwelch67/raspberrypi
值得注意的是自述文件中描述引导顺序的部分:
1)从某种类型的片上发射出来 2)读取SD卡并查找其他gpu特定的引导文件 bootcode.bin,loader.bin,start.elf在第一个分区的根目录中 (脂肪格式化)
3)在同一个目录中,它会查找config.txt,你可以这样做 从默认的700MHz改变手臂速度,改变地址在哪里 加载kernel.img,以及许多其他人 4)它读取kernel.img arm boot二进制文件并将其复制到内存
5)释放臂上的复位,使其从地址开始运行 kernel.img数据写成了
这意味着config.txt与linux内核是分开的,芯片设置了clockspeed本身(只要这个序列实际上是真的。)
该存储库中的代码可能会帮助您回答您的问题。
另外,在Raspberry Pi网站上,他们发了一篇关于官方超频的帖子:http://www.raspberrypi.org/archives/2008
他们提到了一个cpufreq驱动程序,你应该能够获取源代码(因为它是linux源代码树的一部分。)这也可能有所帮助。
答案 3 :(得分:0)
你可以调整你的Raspberry Pi并改变例如ARM时钟速度和Ram / Video Ram。 A good tutorial。
答案 4 :(得分:0)
我知道这是在前一段时间被问及回答,但我遇到了这个问题,希望得到一个快速回答。如果其他人可能想知道这是我如何修复它为我的裸机设置。我通过添加
在RPI3上取得了成功force_turbo = 1
arm_freq = 1200
同样,即使这是裸机,在引导ARM并加载裸机代码(根据我的理解)之前,GPU固件会读取config.txt。我发现这引用了here。请注意,我还尝试以编程方式更改频率但找不到引用(我甚至查看了linux内核源代码树,但我在内核开发方面是一个完整的新手)。