2016-12-13 2 views
1

Я пытаюсь перекрестно скомпилировать файл, чтобы его можно было запустить в Beaglebone Black. Все работает отлично, но если я пытаюсь включить FPU сПерекрестное компиляция - Ошибка: выбранный процессор не поддерживает `fmrx r3, fpexc 'в режиме 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) 

Я получаю следующую ошибку

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

Я также попытался с thumb mode, но я получаю те же ошибки. Конечно, если я удалю часть кода, который инициализирует FPU, он отлично работает.

Почему я получаю эти ошибки?

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 
[...] 

Я на арке, ядро ​​4.8.1

P.S. Мой профессор использует Линаро кросс-компилятор и она работает просто отлично

ответ

1

Большинство компилированных инструментов Линаро настроены для ARMv7 жесткого поплавка по умолчанию (конечно те, Linux, я менее уверен в голом металлических). Рассматривая конфигурацию инструментальной цепочки arm-none-eabi, упакованную Arch, я предполагаю, что он использует только значения GCC по умолчанию для таких вещей, что подразумевает нечто вроде ARMv4t и, самое главное, плавное ABI.

Хотя поколение управляет кодовой -mfpu опции в терминах, которые могут быть использованы инструкции с плавающей точкой, по-видимому, это поплавок ABI, который контролирует, будет ли это позволит вам делать вещи, которые на самом деле только имеют смысл на аппаратной ФПУ, а не под эмуляцией с плавающей запятой.

Когда он не настроен по умолчанию, вы должны явно выбрать с плавающей точкой ABI подразумевающей фактический аппаратным FPU, т.е. -mfloat-abi=hard (или -mfloat-abi=softfp, но на самом деле нет причин, чтобы использовать, что если вам не нужно связывать с другими программно плавающий код).

Смежные вопросы