我正在寻找一种方法,以获得高分辨率定时器(时钟源)上的Android。这必须是在本机代码,并可能是相当不可移植的。我想要微秒分辨率,或者更好。对于我的特殊应用,分辨率比精度更重要,而单调的计时器是最好的。我一直在使用Android4.0.3在一个特定的ARMv7芯片组上进行测试。
到目前为止我尝试过的是:
clock_gettime(CLOCK_MONOTONIC)
:在目标硬件上以1ms为单位递增(编辑最初以为是10 is,因为我的代码中有错误,1ms是正确的,但仍然不是很好)gettimeofday()
:类似于clock_gettime我没试过的是:
System.nanoTime()
:这不是原生的。我相信它是基于clock_gettime()的,但是我更愿意找出隐藏的东西,并直接使用它。/dev/rtc
SysTick
(ARM.pdf)或通用计时器(GPT)。另见(相关问题,但没有答案):
发布于 2013-02-21 06:20:15
您可以使用CPU周期计数器来测量这两个时刻之间的周期数,然后将其转换为秒。为了保证CPU以其正常频率运行,可以将它的调速器切换到“性能”模式(在Play存储中有许多应用程序可以这样做,但是需要根访问)。您还必须冷却您的设备,以确保CPU没有节流(这是特别重要的手机)。最后,您必须将代码绑定到单个核心(最好是核心0,因为系统可以将其他内核脱机)。
访问ARM上的循环计数器有两种方法:在Linux中使用perf_event子系统或直接从CP15协处理器读取循环计数器。只有在编译了Linux内核并支持此子系统(文件/proc/sys/内核/perf_ perf_event _paranoid存在)并且读取事件计数器不受限制时,才能使用Linux方法(文件/proc/sys/ work /perf_ event _paranoid包含0或-1;通过根访问,您可以覆盖该文件中的值)。只有在启用了对性能计数器的用户模式访问时,CP15方法才能工作(默认情况下,它总是禁用的,您必须修补内核或使用内核驱动程序来启用它)。耶普!图书馆 (我是作者)能够在任何可用的情况下使用任何一种方法,并包括一个内核模式驱动程序,以启用用户模式对性能计数器的访问。您可能会发现这个例子很有用。
发布于 2013-02-21 00:12:19
编辑:您还可以查看https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI和clock_getres()以检查clock_gettime()的分辨率
https://stackoverflow.com/questions/14975349
复制