2013-02-19 3 views
9

J'essaie de comprendre les options gcc pour une chaîne d'outils que je suis en train de mettre en place, pour le conseil de développement: Sabre-lite qui est basé autour du quadri processeur iMX6q de Freescale. Maintenant, je sais que iMX6 est essentiellement un processeur cortex-a9 qui a co-processeurs vfpv3 et néon, et aussi des graphiques vectoriels, 2D et même moteurs 3D. Toutefois, les notes de publication et les guides d'utilisation n'ont pas été trop clairs sur la façon d'activer les options pouvant être activées dans gcc.Options gcc pour un processeur ARM iMX6q freescale

En fait, les options avec lesquelles je peux «jouer» sont les suivantes.

-march= armv7-a    - ok this one is pretty obvious. 
-mfpu= vfpv3/neon    - i can use only the vfpv3 co-processor, or both (respectively, depends on option) 
-mfloat-abi=softfp/soft/hard - I guess I can choose hard here, as there is hardware for fp operations 
-mcpu=cortex-a9    - is it option even necessary? it is not clear if it just an alias for -march or something else. 

Y a-t-il d'autres options que je devrais activer? Pourquoi la chaîne d'outils ont comme options par défaut pour construire le noyau linux/uboot/packages suivants:

-march= armv7-a -mfpu= vfpv3 -mfloat-abi=softfp 

Merci pour votre aide

+4

Votre -mfloat-abi doit correspondre selon ABI est utilisé sur votre système. softfp utilise également du matériel à virgule flottante, mais la convention d'appel diffère. Vous pouvez vérifier avec "readelf -A/bin/ls" (par exemple). "Tag_ABI_VFP_args: les registres VFP" signifie difficile. – unixsmurf

+0

extrêmement utile, merci beaucoup! – nass

+0

(Bien sûr, si vous compilez nativement sur votre système cible en utilisant le gcc natif du système, quel que soit l'ABI correct sera le défaut dans le compilateur, et peut être omis.) – unixsmurf

Répondre

6

Utilisez -mthumb -O3 -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -mfloat-abi=softfp. Notez que par défaut, le compilateur ne vectorise pas les opérations à virgule flottante en utilisant NEON car NEON ne supporte pas les nombres dénormaux. Si vous avez une certaine perte de précision, vous pouvez faire en sorte que gcc utilise NEON pour le virgule flottante en ajoutant le commutateur -ffast-math.

+2

hey là, s'il vous plaît élaborer un peu plus. Pourquoi devrais-je utiliser softfp et pas dur? Aussi -O3, est une optimisation trop agressive pour le noyau linux. non? Je veux dire que je risque d'avoir des cauchemars en essayant de compiler u-boot, le noyau et les paquets. non? merci pour le reste des options – nass

+2

La différence entre softfp et hard est la façon dont les paramètres à virgule flottante sont transmis et cela dépend de la distribution Linux que vous utilisez. Puisque la valeur par défaut dans votre compilateur est softfp, il est probable que votre distribution Linux passe les paramètres à virgule flottante dans les registres entiers (cependant, elle peut toujours utiliser la FPU matérielle pour les opérations de FP). Si vous voulez compiler uniquement le noyau Linux ou U-boot, ne modifiez pas les valeurs par défaut du compilateur; les options ci-dessus sont pour compiler des programmes d'espace utilisateur. –

Questions connexes