在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处理器上编写类似于上面内联汇编代码 (计算指令的执行经过时间)?

您应该读取协处理器p15PMCCNTR寄存器(不是实际的协处理器,只是CPUfunction的入口点)以获得循环计数。 请注意,只有在以下情况下,它才适用于非特权应用:

  1. 无特权的PMCCNTR读数被赋予:

    PMUSERENR寄存器的位0必须设置为1( 官方文档 )

  2. PMCCNTR实际上是计算周期:

    PMCNTENSET寄存器的第31位必须设置为1( 官方文档 )

这是它如何完成的真实例子 。