Assembly ARM/Raspberry Pi asm延迟

Assembly ARM/Raspberry Pi asm延迟,assembly,arm,delay,raspberry-pi,Assembly,Arm,Delay,Raspberry Pi,我试图在ASM中运行的Raspberry Pi上实现延迟。(裸金属) 但是用我的代码,我的频率只有13.6Mhz或每秒1360万个SUB+bne,但为什么会这样,arm内核在config.txt中设置为700Mhz __asm__ volatile ( "1: subs %0, %0, #1 \n\t" "bne 1b" : : "r"(cycles)); 我已经用接近100ms的输出GPIO对其进行了测试,然后进行

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

但是用我的代码,我的频率只有13.6Mhz或每秒1360万个SUB+bne,但为什么会这样,arm内核在config.txt中设置为700Mhz

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

我已经用接近100ms的输出GPIO对其进行了测试,然后进行了除法。

我认为这可能不是实现延迟的最佳方式,因为您完全依赖于执行这对指令(sub,b)所需时间的知识,这可能会在不同的操作模式下发生变化,等等

我认为您可以尝试两种不同的选择,它们适用于任何操作条件,并且我认为,它们比您的方法更可靠:

  • 忙等待:获取入口当前系统计时器的值(t0)。环在每次迭代中,比较计数,如果它大于预期的系统计时器值(t0+您希望等待的时间,单位为秒·滴答/秒),则返回
  • 中断例行程序:设置一个定时器中断,以便在等待正确时间的同时做其他事情
  • 您拥有有关在中获取系统计时器值的内存方向的所有信息


    无论如何,我的目的只是尝试并指出另一套解决方案,以便您可以根据需要进行探索。以上答案对于您的特定代码来说是很好的,我认为^。

    我的意思是,这意味着SUB+bne在下一个SUB+bne之前需要50个nop周期,这似乎太多了?您是否启用了缓存?指令可能需要一个以上的周期,特别是当它们是分支时。此外,您可能需要将系统时钟设置为在700MHz下运行;这只是意味着它能够跑那么快。它可能不会以那样的速度启动。您开始时的值是多少,基本上您希望通过这个循环多少次。这是一个紧密的循环,你正在破坏管道,它甚至不会接近700Mhz,即使有非常快的内存或一级缓存。从那以后,速度会变慢。这是一种非常糟糕的延迟方式,在一些执行时间更具确定性的旧微控制器上效果很好,但在这里它不起作用。是的,我也考虑过这个问题,也许我应该做出多个“NOP”(如1U的700),但我没有找到一种聪明的方式。你提到你在裸机上运行,但是你没有说你是如何设置处理器的。根据我使用基于ARMv7的设备(Raspberry Pi是基于ARMv6的设备)的经验,在缓存能够正确缓存之前,需要启用MMU。您是否已启用MMU(具有适当的页表)以及缓存?如果不是,那么50个周期/迭代也不是意外的……对忙等待方法的一个批评是(从我能找到的情况来看),Raspberry Pi的用户可读时钟运行频率为1MHz,即每滴答700个指令周期-可能对每个人来说都不够好。