2009-10-21 12 views
10

Estoy buscando una manera de diferenciar en tiempo de ejecución entre dispositivos equipados con el nuevo procesador ARM (como iPhone 3GS y algunos iPods 3G) y dispositivos equipados con los viejos procesadores ARM. Sé que puedo usar uname() para determinar el modelo del dispositivo, pero como solo algunos de los iPod touch 3G recibieron un impulso en su procesador ARM, esto no es suficiente.Modelo de procesador de detección de iPhone/Soporte de NEON

Por lo tanto, estoy buscando uno de estos:

  1. Una forma de detectar modelo de procesador - supongo que no hay ninguno.
  2. Una forma de determinar si las instrucciones de neón de ARM son compatibles. De esto podría obtener una respuesta.
  3. Una forma de determinar el tamaño total de almacenamiento de los dispositivos - la combinación de esto con el modelo de dispositivo ya conocido podría llevarme a la respuesta con desaliento.
  4. < ENTER IDEA AL AZAR>

Gracias de antemano :)

+0

¡Buena pregunta! Acabo de consultar el manual de referencia de Omap3 y los bits de soporte del conjunto de instrucciones en los registros del coprocesador no son accesibles desde el modo de usuario ... –

+0

¿Para qué fin? Parece que, independientemente de la decisión que intente tomar en su aplicación, es probable que haya una capacidad que pueda probar, en lugar de ir de lado por el modelo del procesador. –

+1

Estoy haciendo cálculos intensivos. No estoy seguro de qué capacidad podría probar. Puedo medir el rendimiento y adaptarme a eso, lo cual suena como un buen enfoque, pero me temo que es bastante difícil para mí en mis circunstancias. Me resulta difícil creer que no hay forma de saber si las instrucciones de neón están disponibles o no. – yonilevy

Respuesta

5

Una solución que se me ocurre, está detectando si OpenGL ES 2.0 está disponible, ya que los nuevos procesadores permiten eso.

Hay un article at mobileorchard sobre cómo hacerlo.

+0

Gracias, esa es una forma bastante decente de implementar este truco. El único inconveniente, sin embargo, es que la única manera de saber si OpenGL ES 2.0 está disponible es llamando a EAGLContext :: initWithAPI y verificando el valor de retorno, lo que significa la introducción de OpenGL en mi proyecto. De todos modos, a menos que encuentre una mejor manera, podría hacer eso. – yonilevy

+0

Sí, estoy de acuerdo que es una pena, y probablemente una operación pesada solo para determinar la capacidad de un dispositivo. – pgb

12

No es exactamente lo que estás preguntando, pero una solución fácil es construir tu grasa de aplicación, de modo que contenga código ejecutable para ARMv6 y ARMv7. Si hace esto, el código apropiado se ejecutará en el procesador automáticamente, y no necesita hacer ninguna comprobación de tiempo de ejecución. Efectivamente, está dejando que el cargador haga la detección en tiempo de ejecución por usted.

Para ello, cambie el ajuste Arquitecturas en su proyecto XCode de "Estándar (ARMv6)" a "optimizado (ARMv7 ARMv6)"

Luego, en su aplicación, esto se hace:

#if defined __ARM_NEON__ 
    // Code that uses NEON goes here 
#else // defined __ARM_NEON__ 
    // Fallback code without NEON goes here 
#endif // defined __ARM_NEON__ 

Hay una macro similar que puede usar para verificar las funciones de ARMv7 (que no sean NEON), que no puedo recordar en la parte superior de mi cabeza.

Si realmente desea hacer el despacho en tiempo de ejecución, eche un vistazo a la función sysctlbyname en libc. Específicamente, creo que buscar el parámetro HW_MACHINE_ARCH puede resultarle útil.

+0

Necesito comprobar si sysctlbyname puede proporcionarme la información que necesito. Desafortunadamente, no tengo un iPod con el nuevo procesador a mano, así que no puedo. ¿Alguien intentó esto? Puede ser la forma definitiva, pero realmente depende de lo que se define allí. – yonilevy

+0

También es curioso si se trata de una manera confiable: alguien por favor confirme si esto funciona para iPhone (3GS) y iPod touch (3º) – Till

+2

La macro '__ARM_NEON__' será definida por el compilador al apuntar a procesadores ARMv7 que tengan NEON (que incluye tanto el toque de 3gs como el de 3ª generación). –

0

Sé que esto es malo, pero lo mejor que se me viene a la mente es detectar si el dispositivo admite la grabación de video. Actualmente, solo los dispositivos iPhone y iPod basados ​​en ARM7 lo admiten, de ahí que sea una forma legítima, supongo.

Para hacerlo, utilice los tipos de medios disponibles de UIImagePickerControllerForSourceType junto con isSourceTypeAvailable en kUTTypeMovie.

1

EDITAR: He retirado esta respuesta, ya que dejó fuera un agujero evidente que me di cuenta más tarde: ¿qué hacer cuando tenemos un subtipo desconocido en algún hardware futuro? ESTO NO FUE A FUTURO-PRUEBA. Además, la incertidumbre del estado documentado de esa API no ayuda, dada la tolerancia cero de Apple en el uso de API no documentadas.

Debe usar la respuesta de Stephen Canon y crear la grasa de su aplicación. En este momento, no es posible detectar el tiempo de ejecución confiable y con garantía de futuro (para mi sorpresa, se lo aseguro).