2013-02-20 11 views
7

Sto cercando un modo per ottenere il timer ad alta risoluzione (sorgente di clock) su Android. Questo deve essere nel codice nativo e può essere abbastanza non portatile. Vorrei risoluzione al microsecondo o meglio. Per la mia particolare applicazione, la risoluzione è più importante della precisione e un timer monotono è il migliore. Ho provato su un particolare chipset ARMv7 con Android 4.0.3.Come ottenere il temporizzatore ad alta risoluzione nel codice nativo di Android?

Quello che ho provato finora:

  • clock_gettime(CLOCK_MONOTONIC): incrementi in unità di 1 ms su hardware di destinazione (EDIT inizialmente ho pensato 10ms a causa di bug nel mio codice, 1ms è corretto, ma ancora non molto buono)
  • gettimeofday(): simile a clock_gettime

Quello che non ho provato:

Vedi anche (domande relative, ma nessuna risposta):

+0

Si può presumere l'accesso di root sul dispositivo? –

+0

@Maratyszcza: Sì, potrei avere root se necessario. –

+0

Non si tratta di Android ma di Linux, e non è possibile. http://elinux.org/High_Resolution_Timers – auselen

risposta

6

Si potrebbe utilizzare contatore di cicli di CPU per misurare il numero di cicli tra i due momenti e poi convertirlo a secondi. Per garantire che la CPU funzioni alla sua frequenza nominale, cambia il suo regolatore di scala in modalità "performance" (c'è un numero di app in Play Store per farlo, ma è necessario l'accesso root). Dovrai anche raffreddare il tuo dispositivo per assicurarti che la CPU non acceleri (questo è particolarmente importante per i telefoni). Infine, devi associare il tuo codice a un singolo core (preferibilmente il core 0, perché altri core possono essere messi offline dal sistema).

Ci sono due modi per accedere contacicli su ARM: utilizzando sottosistema perf_event in Linux o leggendo direttamente contatore di cicli da CP15 coprocessore.il metodo perf_event funzionerà solo se il kernel Linux è compilato con il supporto per questo sottosistema (il file/proc/sys/kernel/perf_event_paranoid esiste) e la lettura dei contatori di eventi non è limitata (il file/proc/sys/kernel/perf_event_paranoid contiene 0 o - 1; con l'accesso root è possibile sovrascrivere il valore in questo file). Il metodo CP15 funzionerà solo se è abilitato l'accesso in modalità utente ai contatori delle prestazioni (per impostazione predefinita è sempre disabilitato e sarà necessario applicare una patch al kernel o utilizzare un driver del kernel per abilitarlo). Yeppp! library (Sono l'autore) è in grado di utilizzare entrambi i metodi ogni volta che è disponibile e include un driver in modalità kernel per abilitare l'accesso in modalità utente ai contatori delle prestazioni. È possibile trovare this example utile.

+0

Ho menzionato la stessa cosa, sembra che a qualcuno non piaccia il mio suggerimento ... – sgupta

0
  1. Android non supporta ARMv7-M, in modo da Systick è fuori dall'equazione.
  2. io non sono veramente sperimentato con timer in Android/Linux, se avete intenzione di eseguire questo software sul proprio dispositivo, è possibile abilitare PMU in Linux e utilizzare il ciclo della CPU Conte registrarsi per la precisione in fase di nanosecondi. Questo non è davvero consigliabile se avete intenzione di pubblicare il vostro software o di offrirlo ad alcuni utenti finali in quanto i produttori hanno diverse configurazioni del kernel su dispositivi diversi e quindi PMU potrebbe non essere abilitato/disponibile.

EDIT: Si potrebbe inoltre osservare https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI e clock_getres() per verificare la risoluzione di clock_gettime()

Problemi correlati