7

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

到目前为止我已经尝试过:

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

我没有尝试过的:

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

4

2 回答 2

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 方法仅在启用用户模式访问性能计数器时才有效(默认情况下始终禁用,您必须修补内核或使用内核驱动程序来启用它)。耶!图书馆(我是作者)能够在可用时使用任何一种方法,并且包括一个内核模式驱动程序以启用用户模式对性能计数器的访问。您可能会发现此示例很有帮助。

于 2013-02-21T14:20:15.663 回答
0
  1. Android 不支持 ARMv7-M,因此 Systick 不适用。
  2. 我对 android/linux 中的计时器并没有真正的经验,如果你要在自己的设备上运行这个软件,你可以在 linux 中启用 PMU 并使用 CPU 的周期计数寄存器来获得接近纳秒的精度。如果您要发布您的软件或将其提供给某些最终消费者,这并不是真正可取的,因为制造商在不同的设备上具有不同的内核配置,因此 PMU 可能无法启用/可用。

编辑:您还可以查看https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI和 clock_getres() 以检查 clock_gettime() 的分辨率

于 2013-02-21T08:12:19.863 回答