2013-02-20 76 views
7

我正在尋找一種方法來獲取Android上的高分辨率定時器(時鐘源)。這必須使用本機代碼,並且可能相當不便攜。我想要微秒分辨率,或更好。對於我的特殊應用,分辨率比精度更重要,而單調的計時器是最好的。我一直在用Android 4.0.3測試特定的ARMv7芯片組。如何在Android本機代碼中獲取高分辨率計時器?

我試過到目前爲止:

  • clock_gettime(CLOCK_MONOTONIC):增量1ms的單位在目標硬件上(編輯原本我以爲,由於10ms的錯誤在我的代碼,1ms的是正確的,但仍然不是很好)
  • gettimeofday():類似clock_gettime

我還沒有嘗試過:

參見(相關的問題,但沒有回答):

+0

你能假設設備的根訪問權限? – 2013-02-20 09:20:38

+0

@Maratyszcza:是的,如果需要,我可以擁有根。 – 2013-02-20 09:50:01

+0

這不是關於Android,而是Linux,這是不可能的。 http://elinux.org/High_Resolution_Timers – auselen 2013-02-20 10:31:23

回答

6

你可以使用CPU週期計數器測量週期的兩個時刻之間的號碼,然後將其轉換的分辨率到秒。爲了保證CPU以標稱頻率運行,將其調節調節器切換到「性能」模式(Play商店中有許多應用程序可以執行此操作,但需要根訪問權限)。你也必須很好地冷卻你的設備,以確保CPU不會調節(這對手機來說尤其重要)。最後,你必須將你的代碼綁定到單個核心(最好是核心0,因爲系統可以讓其他核心脫機)。

有兩種方法可以訪問ARM上的循環計數器:在Linux中使用perf_event子系統或直接從CP15協處理器讀取循環計數器。如果Linux內核編譯時支持該子系統(文件/ proc/sys/kernel/perf_event_paranoid存在)並且讀取事件計數器不受限制(文件/ proc/sys/kernel/perf_event_paranoid包含0或 - 1;有了root權限,你可以覆蓋這個文件中的值)。只有在啓用對性能計數器的用戶模式訪問時,CP15方法才能工作(默認情況下,它始終處於禁用狀態,您必須修補內核或使用內核驅動程序來啓用它)。 Yeppp! library(我是作者)能夠在任何時候使用任何方法,並且包含一個內核模式驅動程序,以啓用對性能計數器的用戶模式訪問。你可能會發現this example有幫助。

+0

我提到了同樣的事情,看起來像有人不喜歡我的建議一樣多... – sgupta 2013-02-23 16:26:51

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()