Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo obtener un temporizador de alta resolución en código nativo de Android?

Estoy buscando una manera de obtener el temporizador de alta resolución (fuente de reloj) en Android. Debe estar en código nativo y puede ser bastante no portátil. Me gustaría una resolución de microsegundo, o mejor. Para mi aplicación en particular, la resolución es más importante que la precisión, y un temporizador que es monótono es el mejor. He estado probando un determinado chipset ARMv7 con Android 4.0.3.

Lo que he probado hasta ahora:

  • clock_gettime(CLOCK_MONOTONIC) : incrementos en unidades de 1ms en el hardware de destino ( EDIT originalmente pensé 10ms debido a error en mi código, 1ms es correcto, pero no muy bueno)
  • gettimeofday() : similar a clock_gettime

Lo que no he probado:

  • System.nanoTime() : no es nativo. Creo que se basa en clock_gettime (), pero prefiero averiguar lo que está bajo el capó y usarlo directamente.
  • /dev/rtc
  • Algún tipo de instrucción / instalación ARM, tal vez SysTick ( http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf ) o el temporizador de uso general (GPT).

Ver también (preguntas relacionadas, pero sin respuesta):

  • Temporizador de alta precisión en Android JNI

  • Obtención de sincronización de alta precisión en Android

  • ¿Los hilos son lo suficientemente fiables para calcular segundos?
  • Capturar / Interceptar los intentos de Android durante el tiempo de ejecución
  • Sincronizar la hora del sistema en 2 teléfonos
  • Android: cambia el formato de hora según el formato de hora actual del dispositivo
  • Tiempo de sincronización para la grabación de datos en varios dispositivos Android
  • Tiempo desde el primer arranque
  • SetMinDate (...) para DatePicker no funciona cuando se invoca una segunda vez
  • Cómo llegar el tiempo en la ubicación actual
  • 2 Solutions collect form web for “¿Cómo obtener un temporizador de alta resolución en código nativo de Android?”

    Usted podría utilizar el contador de ciclo de la CPU para medir el número de ciclos entre los dos momentos y luego convertirlo en segundos. Para garantizar que la CPU funcione a su frecuencia nominal, cambie su regulador de escala al modo "rendimiento" (hay varias aplicaciones en Play Store para hacerlo, pero necesita acceso root). También tendrá que enfriar bien su dispositivo para asegurarse de que la CPU no se apaga (esto es especialmente importante para los teléfonos). Finalmente, usted tiene que enlazar su código a un solo núcleo (preferiblemente núcleo 0, porque otros núcleos pueden ser puestos fuera de línea por el sistema).

    Hay dos maneras de acceder al contador de ciclos en ARM: usar el subsistema perf_event en Linux o leer directamente el contador de ciclos del coprocesador CP15. El método perf_event sólo funcionará si el kernel de Linux está compilado con soporte para este subsistema (el archivo / proc / sys / kernel / perf_event_paranoid existe) y contadores de eventos de lectura no está restringido (el archivo / proc / sys / kernel / perf_event_paranoid contiene 0 o – 1, con acceso root puede sobrescribir el valor en este archivo). El método CP15 funcionará sólo si el acceso de modo de usuario a los contadores de rendimiento está habilitado (por defecto siempre está deshabilitado, y tendrá que corregir el kernel o usar un controlador del kernel para habilitarlo). Yeppp! Biblioteca (soy el autor) es capaz de utilizar cualquiera de los métodos siempre que esté disponible, e incluye un controlador en modo kernel para permitir el acceso de modo de usuario a los contadores de rendimiento. Puede encontrar este ejemplo útil.

    1. Android no es compatible con ARMv7-M, por lo que Systick está fuera de la ecuación.
    2. No estoy realmente experimentado con los temporizadores en android / linux, Si va a ejecutar este software en su propio dispositivo, Puede habilitar PMU en linux y utilizar el registro de cuenta de ciclo de la CPU para la precisión cerca de nanosegundos. Esto no es realmente recomendable si va a publicar su software o ofrecerlo a algún consumidor final como fabricantes tienen configuración de kernel diferente en diferentes dispositivos y por lo tanto PMU puede no estar habilitado / disponible.

    EDIT: También puede buscar en https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI y clock_getres () para comprobar la resolución de clock_gettime ()

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.