如何在Android本机代码中获得高分辨率计时器?

时间:2013-02-20 08:33:08

标签: android time arm

我正在寻找一种在Android上获得高分辨率计时器(时钟源)的方法。这必须是本机代码,并且可能相当不可移植。我想要微秒分辨率,或者更好。对于我的特定应用,分辨率比精度更重要,单调的定时器是最好的。我一直在使用Android 4.0.3测试特定的ARMv7芯片组。

到目前为止我尝试过:

  • clock_gettime(CLOCK_MONOTONIC):在目标硬件上以1ms为单位递增(编辑最初因为我的代码中的错误而认为10毫秒,1毫秒是正确的但仍然不是很好)
  • gettimeofday():类似于clock_gettime

我没有尝试过:

另见(相关问题,但没有答案):

2 个答案:

答案 0 :(得分:6)

您可以使用CPU周期计数器来测量两个时刻之间的周期数,然后将其转换为秒。为了保证CPU以其标称频率运行,将其缩放调控器切换到“性能”模式(Play商店中有许多应用程序可以执行此操作,但需要root访问权限)。您还必须很好地冷却您的设备,以确保CPU没有节流(这对手机尤为重要)。最后,您必须将代码绑定到单个内核(最好是内核0,因为系统可以使其他内核脱机)。

在ARM上访问循环计数器有两种方法:在Linux中使用perf_event子系统或直接从CP15协处理器读取循环计数器。 perf_event方法仅在Linux内核编译时支持此子系统(文件/ proc / sys / kernel / perf_event_paranoid存在)且读取事件计数器不受限制(文件/ proc / sys / kernel / perf_event_paranoid包含0或 - ) 1;使用root访问权限,您可以覆盖此文件中的值)。只有在启用了对性能计数器的用户模式访问时,CP15方法才会起作用(默认情况下,它始终被禁用,您必须修补内核或使用内核驱动程序启用它)。 Yeppp! library(我是作者)能够在可用时使用任一方法,并包括内核模式驱动程序以启用对性能计数器的用户模式访问。您可能会发现this example有帮助。

答案 1 :(得分:0)

  1. Android不支持ARMv7-M,因此Systick不合适。
  2. 我对android / linux中的计时器并不熟悉,如果你要在自己的设备上运行这个软件,你可以在linux中启用PMU并使用CPU的循环计数寄存器来获得接近纳秒的精度。如果您要发布软件或将其提供给某些终端消费者,这不是真的可取的,因为制造商在不同设备上具有不同的内核配置,因此PMU可能无法启用/可用。
  3. 编辑:您还可以查看https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI和clock_getres()来检查clock_gettime()的分辨率