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:

  • Disposición personalizada de Android
  • Android usb requestWait no volver
  • Android: Inicie una actividad inmediatamente y luego cargue el contenido
  • C2DM: ¿Cómo utilizar el permiso de C2D_MESSAGE?
  • ¿Cómo puedo hacer cumplir una referencia circular en un RelativeLayout?
  • Selección de un archivo de imagen de la Galería mediante FileProvider
    • 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

  • Prueba de Snackbar con Espresso
  • Caught a RuntimeException de la implementación de stub de enlace cuando intercambia datos en arrayadapter
  • Cómo agregar un servicio de sistema a Android Framework
  • Cómo agregar programaticamente una cuenta personalizada en android?
  • Abrir mapa de la calle trabajando offline en Android
  • Cuando llama a initLoader en Fragment?
  • 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.