对于我的项目我必须使用内联汇编指令例如rdtsc来计算一些C/C++指令的执行时间。
以下代码似乎适用于 Intel 但不适用于 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
寄存器(不是真正的协处理器,只是 CPU 函数的入口点)以获得周期计数.请注意,只有在以下情况下,它才可用于非特权应用:
允许非特权
PMCCNTR
读取:PMUSERENR
寄存器的位 0 必须设置为 1 ( official docs )PMCCNTR
实际上是在计数周期:PMCNTENSET
寄存器的位 31 必须设置为 1 ( official docs )
这是 a real-world example它是如何完成的。
关于c++ - ARM 中是否有与 rdtsc 等效的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454157/