在ARM中是否有与rdtsc等效的指令?
对于我的项目, 我必须使用内联汇编指令 (如rdtsc)来计算某些C / C ++指令的执行时间。
以下代码似乎适用于英特尔,但不适用于ARM处理器:
{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);} //The C++ statement to measure its execution time {unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);} time = t1-t0;
我的问题是:
如何在ARM处理器上编写类似于上面的内联汇编代码 (计算指令的执行经过时间)?
您应该读取协处理器p15
的PMCCNTR
寄存器(不是实际的协处理器,只是CPUfunction的入口点)以获得循环计数。 请注意,只有在以下情况下,它才适用于非特权应用:
-
无特权的
PMCCNTR
读数被赋予:PMUSERENR
寄存器的位0必须设置为1( 官方文档 ) -
PMCCNTR
实际上是计算周期:PMCNTENSET
寄存器的第31位必须设置为1( 官方文档 )
这是它如何完成的真实例子 。