Перейти к содержанию
    

Вопрос по GCC для ARM926EJ-S

Здравствуйте.

 

Какое значение опции -mfpu GCC должно использоваться для полностью аппаратной (и максимально эффективной, без оглядки на совместимость) плавающей точки в ядре ARM926EJ-S?

Что нужно собрать для компиляции кроме gcc и binutils? Поскольку проект использует printf() и проч. нужна ли uClibc?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

 

Какое значение опции -mfpu GCC должно использоваться для полностью аппаратной (и максимально эффективной, без оглядки на совместимость) плавающей точки в ядре ARM926EJ-S?

Что нужно собрать для компиляции кроме gcc и binutils? Поскольку проект использует printf() и проч. нужна ли uClibc?

А у него (ARM926EJ-S) точно есть FPU? Если FPU точно есть - то Вы должны знать и его тип.

 

А ОС будет? Если Linux - то да, uClibc или обычная glibc нужна. Если нет ОС, то можно и самому написать printf.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

amw:

А у него (ARM926EJ-S) точно есть FPU? Если FPU точно есть - то Вы должны знать и его тип.

Спасибо за ответ, оказалось, что в gcc 4.1.1 есть вариант vfp для -mfpu, которого не было в моём 3.4.3.

А ОС будет? Если Linux - то да, uClibc или обычная glibc нужна. Если нет ОС, то можно и самому написать printf.

ОС не будет, но кроме printf() в проекте есть достаточное количество функций стандартной библиотеки, которые было бы тягостно писать.

 

Попробовал собрать тулчейн заново, но наткнулся на ошибки, итак:

архитектура ARMv5TEJ, ядро — ARM926EJ-S

хост: i686-pc-linux-gnu, gcc-4.3.2

задача: собрать тулчейн, генерирующий по возможности полностью использующий аппаратные возможности код (например, встроенный векторный FPU)

 

1. binutils-2.19: ./configure --target=arm-elf --prefix=/tmp/arm-elf --with-float=hard --enable-interwork --enable-multilib --disable-nls

– собрано успешно, собранные бинарники были добавлены в $PATH

 

2. gcc-4.1.2: ./configure --target=arm-elf --with-arch=armv5te --with-cpu=arm926ej-s --with-fpu=vfp --with-float=hard --enable-interwork --disable-nls --prefix=$PREFIX --enable-languages=c --disable-libssp --with-newlib --disable-multilib --disable-tls --disable-mudflap --disable-shared --disable-threads

– выдаёт ошибку:

make[4]: Entering directory `/<...>/gcc-4.1.2/host-i686-pc-linux-gnu/gcc'
/<..>/gcc-4.1.2/host-i686-pc-linux-gnu/gcc/xgcc -B/<...>/gcc-4.1.2/host-i686-pc-linux-gnu/gcc/ -B$PREFIX/arm-elf/bin/ -B$PREFIX/arm-elf/lib/ -isystem $PREFIX/arm-elf/include -isystem $PREFIX/arm-elf/sys-include -O2 -O2 -g -O2  -DIN_GCC -DCROSS_COMPILE   -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include  -I. -I. -I../.././gcc -I../.././gcc/. -I../.././gcc/../include -I../.././gcc/../libcpp/include   -g0 -finhibit-size-directive -fno-inline-functions -fno-exceptions -fno-zero-initialized-in-bss -fno-unit-at-a-time -Dinhibit_libc  \
          -c ../.././gcc/crtstuff.c -DCRT_BEGIN \
          -o crtbegin.o
../.././gcc/crtstuff.c:1: sorry, unimplemented: -mfloat-abi=hard and VFP

При этом, в документации к этой версии gcc есть следующее:

-mfpu=name

-mfpe=number

-mfp=number

This specifies what floating point hardware (or hardware emulation) is available on the target. Permissible names are: `fpa', `fpe2', `fpe3', `maverick', `vfp'. -mfp and -mfpe are synonyms for -mfpu=`fpe'number, for compatibility with older versions of GCC.

 

If -msoft-float is specified this specifies the format of floating point values.

Проект gnuarm прилагает для самостоятельной сборки исправленный файл gcc-4.1.2/gcc/config/arm/t-arm-elf, в котором раскоментировано большое количество строк с опциями MULTILIB. Это как–нибудь относится к ошибке?

 

Заранее спасибо.

Изменено пользователем dragigrja

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых - нафига собирать старый 4.1.2 ? Во-вторых там же на gnuarm английским по белому все написано. Берем тупо последний 4.2.3 и по шажочкам :

 

1. ../binutils-2.x.x.x.x/configure --prefix=/usr --target=arm-elf

--disable-nls --enable-interwork --enable-multilib

2. uz newlib-*

3. cp t-arm-elf gcc-4.3.2/gcc/config/arm/

4. cd gcc-build

../gcc-4.3.2/configure --target=arm-elf --prefix=/usr --enable-interwork

--enable-multilib --with-float=soft --enable-languages="c,c++"

--with-newlib --with-headers=[newlib-source]/newlib/libc/include

make all-gcc install-gcc

5. [newlib-source]/configure --target=arm-elf --prefix=/usr

--enable-interwork --enable-multilib --with-float=soft

make all install

6. cd [gcc-build]

make all install

7. cd [gdb-build]

[gdb-source]/configure --target=arm-elf --prefix=/usr

--enable-interwork --enable-multilib --with-float=soft

make all install

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... оказалось, что в gcc 4.1.1 есть вариант vfp для -mfpu, которого не было в моём 3.4.3.

Опции то есть, а вот есть ли FPU в железе?

Вероятно Вам потребуется libfloat для Вашего конкретного процессора. Обычно они предоставляются производителем. По крайней мере с Интеловским IXP425 у меня именно так и было.

ОС не будет, но кроме printf() в проекте есть достаточное количество функций стандартной библиотеки, которые было бы тягостно писать.

http://sourceware.org/newlib/

Попробовал собрать тулчейн заново, но наткнулся на ошибки:

...

Это как–нибудь относится к ошибке?

Вроятно да. Не знаю точно, что там именно раскоментировано, но GCC не знает, в Вашем случае, какой FPU использовать для hard-float. Вот в настройках MULTILIB они и задаются.

Сам я никогда не встречал ARM чип с FPU, кроме IXP425 (см выше).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опции то есть, а вот есть ли FPU в железе?

 

--with-float=softfp --with-fpu=vfp

 

Собирается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не правильно выразился.

Не работал с другими чипами с FPU кроме IXP425.

Я не отрицаю существоание таких чипов. И знаю что такие есть. Но точного ответа по обсуждаемому вопросу дать не могу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Harbour:

Во-первых - нафига собирать старый 4.1.2 ?
Я взял его с сайта gnuarm, подумав, что он наиболее подходящ, коль они его используют для раздачи страждущим. При прежних параметрах для configure и заменённым t-arm-elf у gcc-4.2.3 ошибка прежняя:

../.././gcc/crtstuff.c:1: sorry, unimplemented: -mfloat-abi=hard and VFP

Во-вторых там же на gnuarm английским по белому все написано. Берем тупо последний 4.2.3 и по шажочкам :

1. <...>

2. <...>

3. <...>

Сделано. К четвёртому пункту есть вопрос.

 

4. cd gcc-build

../gcc-4.3.2/configure --target=arm-elf --prefix=/usr --enable-interwork

--enable-multilib --with-float=soft --enable-languages="c,c++"

--with-newlib --with-headers=newlib-source/newlib/libc/include

make all-gcc install-gcc

Согласно User Manual LPC32x0 имеет векторный сопроцессор для работы с ПЗ (VFP), который мне хотелось бы использовать в генерируемом тулчейном коде. Если configure указать --with-float=soft, то, как я понимаю, gcc будет эмулировать ПЗ? Мне хотелось бы иметь полностью аппаратную точку.

 

amw:

Опции то есть, а вот есть ли FPU в железе?
Да, есть. Выше есть ссылка на описание серии µC.

 

Вероятно Вам потребуется libfloat для Вашего конкретного процессора. Обычно они предоставляются производителем. По крайней мере с Интеловским IXP425 у меня именно так и было.
А разве libfloat используется не для программной эмуляции FPU для конкретной архитектуры или ядра? Мне хотелось бы иметь именно аппаратную точку.

 

Вроятно да. Не знаю точно, что там именно раскоментировано, но GCC не знает, в Вашем случае, какой FPU использовать для hard-float. Вот в настройках MULTILIB они и задаются.
Спасибо, попробую собрать с ним.

 

gosha:

--with-float=softfp --with-fpu=vfp

 

Собирается?

Возможно, но согласно с мануалом к gcc:

-mfp=number

This specifies what floating point hardware (or hardware emulation) is available on the target. Permissible names are: `fpa', `fpe2', `fpe3', `maverick', `vfp'. -mfp and -mfpe are synonyms for -mfpu=`fpe'number, for compatibility with older versions of GCC.

 

If -msoft-float is specified this specifies the format of floating point values.

при --with-float=softpfp и --with-fpu=vfp точка останется эмулируемой, но при этом будет хранится в формате VFP. Мне бы хотелось иметь аппаратную точку.

 

Благодарю за ответы.

Изменено пользователем dragigrja

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а разве в IXP425 есть FPU? где это написано?

Чесного (по ARM) нету.

Написано в разделе про DSP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Снова здравствуйте.

 

В деле появился некоторый прогресс.

С FPU вопрос решился банальным гуглением: (в прошлый раз я умудрился пропустить эту страницу)

Generating VFP Instructions

Question

How do I get the compiler to generate VFP instructions?

 

Answer

Use the options -mfpu=vfp -mfloat-abi=softfp to enable VFP instructions.

 

If you have a VFPv3 you may use -mfpu=vfp3 -mfloat-abi=softfp to enable VFPv3 instructions.

 

The compiler then assumes that your target hardware has VFP and generates appropriate code. GCC still uses the same ABI used on non-VFP processors, so your program will work fine if part of your code is compiled with software floating-point and other parts are compiled with the options given above.

 

Do not use -mfloat-abi=hard, which is not yet implemented. When this option is implemented it will generate code that is incompatible with the supplied runtime libraries.

Благодаря сообщению Harbour удалось установить gcc-4.3.2: вместо make all, компилирующего всё, что есть, нужно было сделать make all-gcc, собирающего только сам компилятор. Плюс, configure нужно было передать -mfpu=vfp -mfloat-abi=softfp.

 

Следующая проблема состоит в том, что arm-elf-ld не находит crti.o (которого нет в $PREFIX/arm-elf). Я собирал gcc с --disable-multilib, и потому подправил gcc-4.3.2/gcc/config/arm/t-arm-elf:

было:

EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o

# If EXTRA_MULTILIB_PARTS is not defined above then define EXTRA_PARTS here
# EXTRA_PARTS = crtbegin.o crtend.o crti.o crtn.o

стало:

# EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o

# If EXTRA_MULTILIB_PARTS is not defined above then define EXTRA_PARTS here
EXTRA_PARTS = crtbegin.o crtend.o crti.o crtn.o

Увы, crti.o так и не появился.

Изменено пользователем dragigrja

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

disable-multilib подразумевает компиляцию только одного варианта библиотек, если вдруг (в процессе компиляции) нужна crt от другого имеем его отсутсвие. Собирать нужно именно так как я сказал, вот к примеру что у меня стоит, без никаких правок :

 

/usr/lib/gcc/arm-elf/4.3.2/crti.o

/usr/lib/gcc/arm-elf/4.3.2/interwork/crti.o

/usr/lib/gcc/arm-elf/4.3.2/fpu/crti.o

/usr/lib/gcc/arm-elf/4.3.2/fpu/interwork/crti.o

/usr/lib/gcc/arm-elf/4.3.2/be/crti.o

/usr/lib/gcc/arm-elf/4.3.2/be/interwork/crti.o

/usr/lib/gcc/arm-elf/4.3.2/be/fpu/crti.o

/usr/lib/gcc/arm-elf/4.3.2/be/fpu/interwork/crti.o

/usr/lib/gcc/arm-elf/4.3.2/thumb/crti.o

/usr/lib/gcc/arm-elf/4.3.2/thumb/interwork/crti.o

/usr/lib/gcc/arm-elf/4.3.2/thumb/be/crti.o

/usr/lib/gcc/arm-elf/4.3.2/thumb/be/interwork/crti.o

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...