2016-12-13 1 views
1

J'essaye de compiler un fichier pour le flash dans le Beaglebone Black. Tout fonctionne très bien, mais si je tente de permettre à la FPU avecCompilation croisée - Erreur: le processeur sélectionné ne supporte pas `fmrx r3, fpexc 'en mode ARM - Beaglebone

#define set_en_bit_in_fpexc() do { \ 
    int dummy; \ 
    __asm__ __volatile__ ("fmrx %0,fpexc\n\t" \ 
         "orr %0,%0,#0x40000000\n\t" \ 
         "fmxr fpexc,%0" : "=r" (dummy) : :); \ 
} while (0) 

Je reçois l'erreur suivante

Error: selected processor does not support `fmrx r3,fpexc' in ARM mode 
Error: selected processor does not support `fmxr fpexc,r3' in ARM mode 

J'ai aussi essayé avec thumb mode, mais je reçois les mêmes erreurs. Bien sûr, si je supprime la partie du code qui initialise le FPU, cela fonctionne très bien.

Pourquoi j'obtiens ces erreurs?

Makefile

[...] 
CROSSPATH?=/usr/bin 
CROSSPFX=$(CROSSPATH)/arm-none-eabi- 
CC=$(CROSSPFX)gcc 
AS=$(CROSSPFX)as 
LD=$(CROSSPFX)ld 
NM=$(CROSSPFX)nm 
OBJCOPY=$(CROSSPFX)objcopy 
OBJDUMP=$(CROSSPFX)objdump 
CFLAGS=-Wall -Wextra -O2 -ffreestanding 
ARCHFLAGS=-mcpu=cortex-a8 -march=armv7-a -mfpu=neon 
CCARCHFLAGS=$(ARCHFLAGS) -marm 
[...] 

Je suis sur Arche, noyau 4.8.1

post-scriptum Mon professeur utilise le compilateur croisé linaro et il fonctionne très bien

Répondre

1

La plupart des toolchains Linaro sont configurés pour ARMv7 disque flottant par défaut (certainement les ones Linux, je suis moins sûr de ceux en métal nu). En regardant la configuration de la chaîne d'outils arm-none-eabi telle qu'emballée par Arch, je suppose qu'elle utilise simplement les valeurs par défaut de GCC pour des choses comme ça, ce qui implique quelque chose comme ARMv4t, et surtout, ABI soft-float.

Alors que la génération de code contrôles d'options -mfpu en termes dont les instructions à virgule flottante peuvent être utilisés, semble-t-il est le flotteur ABI qui contrôle si elle vous laisse faire des choses qui vraiment ne faire sens sur un FPU matériel, plutôt que sous l'émulation à virgule flottante.

Quand il est pas configuré par défaut, vous devez sélectionner un ABI à virgule flottante impliquant explicitement une FPU matérielle réelle, à savoir -mfloat-abi=hard (ou -mfloat-abi=softfp, mais il n'y a vraiment aucune raison d'utiliser que si vous devez lier contre d'autres Soft- code flottant).