7

Androidで高解像度タイマー(クロックソース)を取得する方法を探しています。これはネイティブ コードである必要があり、かなり移植性がない可能性があります。マイクロ秒以上の解像度が欲しいです。私の特定のアプリケーションでは、分解能は精度よりも重要であり、単調なタイマーが最適です。Android 4.0.3 を搭載した特定の ARMv7 チップセットでテストを行っています。

私がこれまでに試したこと:

  • clock_gettime(CLOCK_MONOTONIC): ターゲット ハードウェア上で 1 ミリ秒単位で増分 ( EDIT当初、コードのバグにより 10 ミリ秒と考えていましたが、1 ミリ秒は正しいですが、まだあまり良くありません)
  • gettimeofday(): clock_gettime と同様

私が試していないこと:

  • System.nanoTime(): これはネイティブではありません。これは clock_gettime() に基づいていると思いますが、内部にあるものを見つけて直接使用することをお勧めします。
  • /dev/rtc
  • ある種のARM命令/機能、おそらくSysTickhttp://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf)または汎用タイマー(GPT)。

も参照してください(関連する質問ですが、回答はありません):

4

2 に答える 2

6

CPU サイクル カウンターを使用して、2 つの瞬間の間のサイクル数を測定し、それを秒に変換できます。CPU が公称周波数で確実に実行されるようにするには、スケーリング ガバナーを「パフォーマンス」モードに切り替えます (Play ストアには多くのアプリがありますが、root アクセスが必要です)。また、CPU がスロットルしないように、デバイスを十分に冷却する必要があります (これは、電話では特に重要です)。最後に、コードを単一のコアにバインドする必要があります (他のコアはシステムによってオフラインにされる可能性があるため、コア 0 が望ましい)。

ARM でサイクル カウンターにアクセスするには、Linux で perf_event サブシステムを使用する方法と、CP15 コプロセッサからサイクル カウンターを直接読み取る方法の 2 つがあります。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 をサポートしていないため、Sysstick は対象外です。
  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 に答える