2013-12-11 34 views
0

我试图在ASM中运行的Raspberry Pi上实现延迟。 (裸金属)ARM/Raspberry Pi asm延迟

但是用我的代码,我只能达到每秒13.6Mhz或13.6Million的频率,但为什么是这种情况,arm core在config.txt中设置为700Mhz。

__asm__ volatile ("1: subs %0, %0, #1 \n\t" 
        "bne 1b" 
        : : "r"(cycles)); 

我已经测试了它的输出GPIO接近100ms,然后分开。

+0

我的意思是这意味着subs + bne在下一个subs + bne之前需要50个nop周期,这似乎太多了? – user1735225

+0

您是否启用了缓存?说明可能需要多个循环,特别是如果它们是分支。另外,您可能必须设置系统时钟以700MHz运行;它只是意味着它能够快速运行。它可能无法以这种速度启动。 –

+0

你开始的价值是多少,基本上你期望通过这个循环多少次。这是一个紧密的循环,你正在甩掉管道,即使有非常快的内存或l1缓存,它也不会接近700Mhz。它会从那里变得更慢。这是一种非常糟糕的延迟方式,对于执行时间稍微确定的一些/老式微控制器来说效果很好,但在这里它不会这样工作。 –

回答

0

我认为这可能不是实现延迟的最佳方式,因为完全依赖于执行指令对(子,b)所需时间的知识,并且这可以在不同模式下进行更改操作,等等,等等

我想你可以尝试两种不同的选择,这将是任何有效的操作条件下,我想,比你的方法更可靠:

  1. 忙等待:获取入口(t0)上当前系统计时器的值。循环。在每次迭代中,比较计数,如果它大于预期的系统计时器值(t0 + time_you_want_to_wait_in_secs·ticks/sec),则返回。
  2. 一个中断例程:设置一个定时器中断,以便在等待正确的时间时做其他事情。

您已获得有关获取系统计时器值的存储器方向的所有信息,其中包括BCM2835 datasheet

无论如何,我的意图只是试图指出另一套解决方案,所以你可以探索他们,如果你想。上面的答案对你的特定代码来说是好的,我认为^^。

+0

忙碌等待方法的一个批评是(从我所能找到的结果来看),Raspberry Pi的用户可读时钟以1 MHz运行,每个tick有700个指令周期 - 可能分辨率不够好。 – Ponkadoodle