我在我的Raspberry PI 2上运行延迟()进行了一些测量,计算10个因子中的1-100000000个循环,并计算了时间过去后的循环计数。这表明没有高速缓存只需要通过一个空循环就足以满足150个周期的延迟(这只是sub + bcs)。一个单一的NOP(以150的顺序)需要32个(总共5030个)没有高速缓存的循环和1.5个循环(总共226.5个)。 orr; add; and; mov; orr; add; and; mov;循环还显示了流水线和CPU的超标量,每个操作码只需要0.15个循环。得到一个良好的时间循环不太好。
总之,我必须放弃,只是使用基于定时器的延迟。没有缓存,实际上这比快速缓存需要150个循环的循环更快。
void delay(uint32_t count) {
uint32_t a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0;
while(count--) {
// branch icache dcache cycles/loop
// no no no ~507
// no no yes 43.005
// no yes no 1.005
// no yes yes 1.005
// yes no no ~507
// yes no yes 43.005
// yes yes no 1.005
// yes yes yes 1.005
// asm ("");
// branch icache dcache cycles/loop
// no no no ~750
// no no yes 67.500
// no yes no 16.500
// no yes yes 16.500
// yes no no ~750
// yes no yes 67.500
// yes yes no 16.500
// yes yes yes 16.500
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// asm ("nop");
// branch icache dcache cycles/loop
// no no no ~505
// no no yes 43.500
// no yes no 1.500
// no yes yes 1.500
// yes no no ~505
// yes no yes 43.500
// yes yes no 1.500
// yes yes yes 1.500
asm ("orr %0, %0, %0" : "=r" (a) : "r" (a));
asm ("add %0, %0, %0" : "=r" (b) : "r" (b));
asm ("and %0, %0, %0" : "=r" (c) : "r" (c));
asm ("mov %0, %0" : "=r" (d) : "r" (d));
asm ("orr %0, %0, %0" : "=r" (e) : "r" (e));
asm ("add %0, %0, %0" : "=r" (f) : "r" (f));
asm ("and %0, %0, %0" : "=r" (g) : "r" (g));
asm ("mov %0, %0" : "=r" (h) : "r" (h));
// branch icache dcache cycles/loop
// no no no ~1010
// no no yes 85.005
// no yes no 18.000
// no yes yes 18.000
// yes no no ~1010
// yes no yes 85.005
// yes yes no 18.000
// yes yes yes 18.000
// isb();
// branch icache dcache cycles/loop
// no no no ~5075
// no no yes 481.501
// no yes no 141.000
// no yes yes 141.000
// yes no no ~5075
// yes no yes 481.501
// yes yes no 141.000
// yes yes yes 141.000
// isb();
// isb();
// isb();
// isb();
// isb();
// isb();
// isb();
// isb();
// isb();
// isb();
}
}
的
可能重复的[如何延迟了ARM Cortex M0 + n个循环,如果没有计时器?](http://stackoverflow.com/questions/27510198/how-to-delay-an-arm-cortex -m0-for-n-cycles-without-a-timer) – samgak
nop 150次... – leppie
不重复。意想不到的是,我正在寻找一个循环,它具有(几乎)相同的指令时序,无需指令高速缓存和分支预测。我知道上面的简单循环运行速度比指令缓存和分支预测快500倍。 –