2013-02-20 13 views
7

Szukam sposobu na uzyskanie zegara o wysokiej rozdzielczości (źródło zegara) na Androida. Musi to być kod natywny i może być dość nieprzenośny. Chciałbym osiągnąć rozdzielczość mikrosekundy lub lepszą. Dla mojego konkretnego zastosowania rozdzielczość jest ważniejsza niż precyzja, a najlepszy jest czasomierz monotoniczny. Testowałem na konkretnym chipsecie ARMv7 z Androidem 4.0.3.Jak uzyskać zegar o wysokiej rozdzielczości w natywnym kodzie systemu Android?

Co próbowałem dotąd:

  • clock_gettime(CLOCK_MONOTONIC): przyrosty w jednostkach 1ms na sprzęcie docelowym (EDIT pierwotnie myślałem 10ms z powodu błędu w kodzie, 1ms jest poprawna, ale nadal nie bardzo dobry)
  • gettimeofday(): podobne do clock_gettime

Co nie próbowałem:

Zobacz także (inne pytania, ale nie odpowiedź):

+0

Czy można założyć dostęp root'a do urządzenia? –

+0

@Maratyszcza: Tak, w razie potrzeby mogę mieć root. –

+0

Nie chodzi o Androida, ale Linuksa, i nie jest to możliwe. http://elinux.org/High_Resolution_Timers – auselen

Odpowiedz

6

można użyć licznika cykli CPU do pomiaru liczby cykli pomiędzy dwoma momentami, a następnie przekształcić go do sekund. Aby zagwarantować, że procesor działa na swojej nominalnej częstotliwości, przełącz jego regulator skalowania na tryb "wydajności" (w sklepie Play jest w nim kilka aplikacji, ale wymagany jest dostęp do konta root). Będziesz również musiał dobrze ochłodzić swoje urządzenie, aby upewnić się, że procesor nie zatrzymuje się (jest to szczególnie ważne w przypadku telefonów). Na koniec musisz powiązać swój kod z pojedynczym rdzeniem (najlepiej z rdzeniem 0, ponieważ inne rdzenie mogą zostać odłączone przez system).

Istnieją dwa sposoby uzyskania dostępu do licznika cykli na ARM: użycie podsystemu perf_event w systemie Linux lub bezpośredni odczyt licznika cykli z koprocesora CP15.Metoda perf_event działa tylko wtedy, gdy jądro Linux jest skompilowane z obsługą tego podsystemu (istnieje plik/proc/sys/kernel/perf_event_paranoid) i liczniki zdarzeń odczytu nie są ograniczone (plik/proc/sys/kernel/perf_event_paranoid zawiera 0 lub - 1; przy dostępie root możesz nadpisać wartość w tym pliku). Metoda CP15 będzie działała tylko wtedy, gdy włączony jest dostęp trybu użytkownika do liczników wydajności (domyślnie jest zawsze wyłączony, a będziesz musiał załatać jądro lub użyć sterownika jądra, aby go włączyć). Yeppp! library (Jestem autorem) jest w stanie użyć dowolnej metody, gdy jest dostępna, i zawiera sterownik trybu jądra, aby umożliwić dostęp do liczników wydajności w trybie użytkownika. Pomocna może być this example.

+0

Wspomniałem o tym samym, wygląda na to, że ktoś nie lubił mojej sugestii tak bardzo ... – sgupta

0
  1. Android nie obsługuje ARMv7-M, tak Systick jest poza równaniem.
  2. Nie mam dużego doświadczenia z zegarami w Androidzie/Linuksie. Jeśli zamierzasz uruchomić to oprogramowanie na swoim własnym urządzeniu, możesz włączyć PMU w linuxie i użyć rejestru licznika cykli procesora, aby uzyskać dokładność zbliżoną do nanosekund. Nie jest to wskazane, jeśli zamierzasz opublikować oprogramowanie lub zaoferować je niektórym użytkownikom końcowym, ponieważ producenci mają różne konfiguracje jądra na różnych urządzeniach, a zatem PMU może nie być włączony/dostępny.

EDIT: Można dodatkowo spojrzeć na https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI i clock_getres(), aby sprawdzić rozdzielczość clock_gettime()

Powiązane problemy