Android 如何在ARM安卓设备上测量linux内核中的极短时间

Android 如何在ARM安卓设备上测量linux内核中的极短时间,android,linux,arm,Android,Linux,Arm,在ARM android设备上调试Linux内核时,我需要测量一个非常短的时间间隔(Nexus 7和高通公司的四核Snapdragon S4 SoC)。我发现ktime_get()可以测量的最短时间间隔是30us,因为Nexus 7使用30MHz定时器,但我的测试代码(一个简单的中断处理程序)运行的时间不到30us,所以我总是得到0us或30us。我尝试读取性能计数器,如下所示: unsigned long t1, t2; asm volatile ("MRC p15, 0, %0,

在ARM android设备上调试Linux内核时,我需要测量一个非常短的时间间隔(Nexus 7和高通公司的四核Snapdragon S4 SoC)。我发现ktime_get()可以测量的最短时间间隔是30us,因为Nexus 7使用30MHz定时器,但我的测试代码(一个简单的中断处理程序)运行的时间不到30us,所以我总是得到0us或30us。我尝试读取性能计数器,如下所示:

   unsigned long t1, t2;
   asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(t1));
   ...... //my interrupt handling code
   asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(t2));
   unsigned long interval = t2 - t1;
但“t1”、“t2”和“interval”的值始终为0

我的问题是: 1.“asm volatile”(“MRC p15,0,%0,c9,c13,0\t\n):“=r”(值));”是否适用于Nexus 7? 2.这个登记册是什么?当前CPU频率或特定频率下的CPU周期? 3.在Nexus7上,有没有什么方法可以测量比30兆赫定时器的滴答声还要短的代码执行时间

非常感谢

谢谢
Wang Li

也许是一个实用的解决方法:假设处理代码总是这样做,您可以通过多次调用来测量它,然后计算每次调用的平均值。谢谢Jewirth。我不能多次运行这段代码,这将改变系统的行为。我已经读了线程,不同的是我需要在内核模式下读CCNT。有人知道在内核模式下启用和读取循环计数器的方法或步骤吗?要启用CCNT,您必须编写内核模块并加载它。然后您可以读取CCNT,也可以从usermode读取。在您提到的问题中,Nils Pipenbrinck于2010年7月15日22:47评论了自己的答案,并解释了如何编写内核模块。