2009-10-21 10 views
10

Je cherche un moyen de différencier à l'exécution entre les appareils équipés du nouveau processeur ARM (tels que l'iPhone 3GS et certains iPods 3G) et les appareils équipés des anciens processeurs ARM. Je sais que je peux utiliser uname() pour déterminer le modèle de l'appareil, mais comme seule une partie des iPod touch 3G a reçu un coup de pouce dans leur processeur ARM, ce n'est pas suffisant.Prise en charge du modèle de processeur iPhone/NEON

Par conséquent, je suis à la recherche d'un de ces:

  1. Une façon de détecter le modèle de processeur - je suppose qu'il n'y a pas.
  2. Une façon de déterminer si les instructions de néon ARM sont prises en charge - à partir de cela, je pourrais en tirer une réponse.
  3. Une façon de déterminer la taille de stockage totale des périphériques - en combinant cela avec le modèle de périphérique déjà connu pourrait me conduire à la réponse.
  4. < ENTER IDEA RANDOM>

Merci à l'avance :)

+0

Bonne question! Je viens de vérifier le manuel de référence Omap3 et les bits de support du jeu d'instructions dans les registres du coprocesseur ne sont pas accessibles en mode utilisateur ... –

+0

À quelle fin? Il semble que, quelle que soit la décision que vous essayez de prendre dans votre application, il existe probablement une capacité que vous pourriez tester, plutôt que d'y aller de profil par modèle de processeur. –

+1

Je fais des calculs intensifs. Je ne suis pas sûr de la capacité que je pourrais tester. Je peux mesurer la performance et m'adapter à cela, ce qui me semble être une bonne approche, mais j'ai peur que ce soit plutôt difficile pour moi dans les circonstances. J'ai du mal à croire qu'il n'y a aucun moyen de savoir si des instructions néon sont disponibles ou non. – yonilevy

Répondre

5

Une solution que je peux penser, détecte si OpenGL ES 2.0 est disponible, puisque les nouveaux processeurs permettent cela. Il y a un article at mobileorchard sur comment faire.

+0

Merci, c'est en fait une manière assez décente d'implémenter ce hack. Le seul inconvénient est que la seule façon de savoir si OpenGL ES 2.0 est disponible est d'appeler EAGLContext :: initWithAPI et de vérifier la valeur de retour, ce qui signifie introduire OpenGL dans mon projet. De toute façon, à moins que je ne trouve un meilleur moyen, je pourrais faire exactement cela. – yonilevy

+0

Oui, je suis d'accord que c'est une honte, et probablement une opération lourde juste pour déterminer une capacité de périphérique. – pgb

12

Pas exactement ce que vous demandez, mais une solution simple est de construire votre graisse d'application, de sorte qu'elle contienne du code exécutable pour ARMv6 et ARMv7. Si vous faites cela, le code approprié sera exécuté automatiquement sur le processeur et vous n'aurez pas besoin de vérifier l'exécution. En effet, vous laissez le chargeur effectuer la détection d'exécution pour vous.

Pour ce faire, modifiez le paramètre Architectures dans votre projet XCode de "Standard (ARMv6)" à "optimisé (ARMv6 ARMv7)"

Ensuite, dans votre implémentation, vous faites ceci:

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

Il existe une macro similaire que vous pouvez utiliser pour vérifier les fonctionnalités ARMv7 (non NEON), dont je ne me souviens pas du haut de ma tête.

Si vous voulez vraiment faire l'expédition d'exécution, jetez un oeil à la fonction sysctlbyname dans libc. Plus précisément, je pense que la recherche du paramètre HW_MACHINE_ARCH peut s'avérer utile pour vous.

+0

Je dois vérifier si sysctlbyname peut me fournir les informations dont j'ai besoin. Malheureusement, je n'ai pas un iPod avec le nouveau processeur à portée de main, donc je ne peux pas. Quelqu'un at-il essayé cela? Cela peut être la voie ultime, mais cela dépend vraiment de ce qui est défini ici. – yonilevy

+0

Aussi curieux si c'est un moyen fiable - quelqu'un plz confirmer si cela fonctionne pour iPhone (3GS) ainsi que sur iPod Touch (3e) – Till

+2

La macro '__ARM_NEON__' sera définie par le compilateur lors du ciblage des processeurs ARMv7 qui ont NEON (qui comprend à la fois le toucher 3gs et le toucher 3ème génération). –

0

Je sais que c'est minable, mais le meilleur qui me vient à l'esprit est de détecter si le périphérique prend en charge l'enregistrement vidéo. Actuellement, seuls les appareils iPhone et iPod basés sur ARM7 le prennent en charge, d'où leur légitimité, je suppose. Pour ce faire, utilisez MediaTypesForSourceType disponible de UIImagePickerController en conjonction avec isSourceTypeAvailable sur kUTTypeMovie.

1

EDIT: J'ai retiré cette réponse, car elle a laissé de côté un trou flagrant que j'ai réalisé plus tard: que faire lorsque nous obtenons un sous-type inconnu sur un futur matériel? CECI N'ETAIT PAS FUTURE. En outre, l'incertitude de l'état documenté de cette API n'aide pas, étant donné la tolérance zéro d'Apple sur l'utilisation d'API non documentées.

Vous devriez utiliser la réponse de Stephen Canon et créer votre application. La détection fiable et à l'épreuve du temps d'exécution n'est pas réalisable pour l'instant (à mon grand désarroi, je vous assure).