Assembly 多核ARM A9上的NOPs

Assembly 多核ARM A9上的NOPs,assembly,arm,multicore,timing,Assembly,Arm,Multicore,Timing,我有一个基于ARMA9的双核处理器,我需要用它进行一些非常特殊的纳秒计时。我计划使用NOP汇编指令通过确定系统时钟每个周期通过的纳秒数来实现这一点 我想知道在处理双核ARM处理器时,在调用NOPs时是否应该考虑一些特殊的因素,因为我只需要处理单核ATMEL和ARM处理器。处理器是否将尝试在两个内核之间自动分配NOP?我是否应该进行双倍系统时钟速度(667MHz)的计时计算,以考虑两个内核?有没有其他我不知道的特殊考虑可能会妨碍我的工作?很明显,如果您运行的是一个非多线程的程序,那么它就无法在两个

我有一个基于ARMA9的双核处理器,我需要用它进行一些非常特殊的纳秒计时。我计划使用NOP汇编指令通过确定系统时钟每个周期通过的纳秒数来实现这一点


我想知道在处理双核ARM处理器时,在调用NOPs时是否应该考虑一些特殊的因素,因为我只需要处理单核ATMEL和ARM处理器。处理器是否将尝试在两个内核之间自动分配NOP?我是否应该进行双倍系统时钟速度(667MHz)的计时计算,以考虑两个内核?有没有其他我不知道的特殊考虑可能会妨碍我的工作?

很明显,如果您运行的是一个非多线程的程序,那么它就无法在两个CPU上运行。它将始终在一个CPU上运行(尽管您不知道是哪个CPU)

使用NOP来计算时间并不是一个好主意,因为您无法控制指令的发出和执行方式,特别是因为Cortex-A9有几个执行单元

虽然我不认为这是一个非常可靠的解决方案,但您至少应该使用一系列具有1个周期定时的相关指令:

ADD r0, r0, r0
ADD r0, r0, r0
...

这将有助于每个周期有一条指令,比NOP操作更好,但这仍然是一个近似值。

否,每个核心运行自己的指令流。你也不需要加倍。你没有说你是否有操作系统,或者是否启用了中断。这些事情可能会打乱你的时间安排;)也不知道ARM CPU是否进行时钟频率调整(节能)。您试图做的可能是站不住脚的。ARM Cortex-A9使用超标量无序核,具有8到11级流水线。即使不考虑外部事件,如果ARM完全记录了所有内容,也必须计算出准确的指令时间。相反,他们的文档中说“Cortex-A9处理器的复杂性使得无法手动计算精确的计时信息。指令的计时通常会受到其他并发指令、内存系统活动和指令流之外的其他事件的影响。”出于兴趣,延误的实际性质是什么?可能有更具创造性的方法来解决这个问题——我所见过的最酷的事情之一是一些外围设备,它们在运行之间需要几百个总线周期的精确延迟;它的编程接口中有一个额外的寄存器,该寄存器完全不起作用,但在读取时需要几百个周期才能返回0:D@Notlikethat延迟的本质是对来自处理器所连接的设备本身的数字输出的特定信号进行计时。为了让它按照我所需要的方式工作,它必须在纳秒的时间内完成。不过我喜欢这个想法,它非常聪明,如果我不想限制自己只使用处理器本身,那很可能是一个尝试。OP仍然需要校准他的延迟循环,但是,将延迟限制改为吞吐量限制是一个很好的建议,这将使向循环中添加指令的效果更加可预测。(延迟限制可能也会节省一点功耗。
的功耗可能更低。是否存在复杂度较低但延迟较高的指令?可能是存储转发往返?),这是架构
nop
指令的全部要点,它被允许从指令流中尽早删除,并在0个周期内“执行”——我不认为Cortex-A9真的能做到这一点,但一些高端内核可能会做到。这一切都非常有帮助,上面的答案已经足够了,我最初建议nop仅仅是因为我在其他试图执行类似计时的代码中看到了这一点。如果我的数学是正确的,我有大约350个时钟周期在任意一个方向上的时间,我希望引入加法r0,r0,r0概念将使我尽可能接近正确的时间possible@brad有这么大的回旋余地,还可以尝试轮询PMU循环计数器之类的方法-如果小心一点,应该可以为适合单个缓存线的循环编写循环。@brad95411 667 MHz时的一个循环长度为1.5纳秒。如果你需要1纳秒的精度,你没有任何回旋余地。