|
Вопрос по ARM-GCC, arm7tdmi все ок, arm926ej-s не хотит :( |
|
|
|
May 29 2006, 19:19
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Решил я занятся изучением ARMов, начал с того что собрал gcc-4.1.1-binutils-1.16.2-newlib-1.4.0 под ARM. Всунул все это дело в Keil (ручками тоже пособирал примерчики), погонял на GDB - все вроде понятно становися как в книжке написано..но только если коипилировать под artm7tdmi при попыткак собрать примерчик под arm926ej-s начинает ругатся, причем обьектники собираются а вот elf почемуто линкером не генерится: Код arm-elf-gcc -c -mcpu=arm926ej-s -I. -mhard-float -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -Wp,-M,-MP,-MT,main.o,-MF,.dep/main.o.d main.c -o main.o arm-elf-gcc -mcpu=arm926ej-s -I. -mhard-float -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -Wp,-M,-MP,-MT,image.o,-MF,.dep/image.elf.d main.o --output image.elf -Wl,-Map=image.map,--cref -lm d:\mingw\local\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bin\ld.exe: ERROR: d:/mingw/local/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(atexit.o) uses FPA instructions, whereas image.elf does not d:\mingw\local\bin\..\lib\gcc\arm-elf\4.1.1\..\..\..\..\arm-elf\bin\ld.exe: failed to merge target specific data of file d:/mingw/local/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib\libc.a(atexit.o)............................. Линкер говорит что обьектник собран с использованием команд FPA а сгениерить elf из этих объектников не хочет. В чем проблема? Хочется глазками посмотреть в asm листингах инструкции счета плавающей запятой для arm926ej-s
|
|
|
|
|
May 29 2006, 20:02
|
Частый гость
 
Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404

|
Я попытался откомпилировать со стандартного WinARM (модифицировав пример с диодами) Код { float i= 0.5; i *= 2.5; i += func[0]; i += 4.333; func[0] = (int)i; }
Compiling C (ARM-only): main.c arm-elf-gcc -c -mcpu=arm926ej-s -I. -gstabs -DROM_RUN -O2 -Wall -Wcast-align -Wimplicit -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow -Wunused -Wa,-adhlns=main.lst -MD -MP -MF .dep/main.o.d -mhard-float -Wnested-externs -std=gnu99 main.c -o main.o main.c: In function 'main': main.c:123: warning: cast increases required alignment of target type /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s: Assembler messages: /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:162: Error: selected processor does not support `ldfs f2,.L13' /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:163: Error: selected processor does not support `ldfd f1,.L13+4' /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:218: Error: selected processor does not support `flts f0,r3' /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:226: Error: selected processor does not support `adfs f0,f0,f2' /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:227: Error: selected processor does not support `adfd f0,f0,f1' /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:228: Error: selected processor does not support `mvfs f0,f0' /cygdrive/c/DOCUME~1/sergu1/LOCALS~1/Temp/ccYuG2OR.s:229: Error: selected processor does not support `fixz r3,f0' результат на лицо =) Тем более раз первая команда выолнена успешно листинг будет в main.lst
Сообщение отредактировал sff - May 29 2006, 20:03
|
|
|
|
|
May 30 2006, 04:36
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата(makc @ May 30 2006, 08:19)  Проблема во флагах объектных файлов: тех, которые в библиотеке и ваших, новособранных. Эти флаги, касающиеся FPA - не совпадают. Вот он и не линкует... Чтобы разобраться где и какие флаги установлены - воспользуйтесь утилитой arm-elf-objdump с соответствующими ключами. После этого нужно будет разобраться с ключиком компилятора -mfpu=... Понятно куда рыть. Наверно я не так newlib при сборке сконфигурировал, без поддержки плавающей точки аппаратно. Вечером попробую покрутить ее так и сяк. Вот что генерится для объектника: Код 0000820c <main>: float volatile a,b;
int main( void ) { 820c: e1a0c00d mov ip, sp 8210: e92dd800 stmdb sp!, {fp, ip, lr, pc} 8214: e24cb004 sub fp, ip, #4; 0x4 a = 03; 8218: e59f2044 ldr r2, [pc, #68]; 8264 <.text+0x244> 821c: e59f3044 ldr r3, [pc, #68]; 8268 <.text+0x248> 8220: e5823000 str r3, [r2] b = 02; 8224: e59f2040 ldr r2, [pc, #64]; 826c <.text+0x24c> 8228: e59f3040 ldr r3, [pc, #64]; 8270 <.text+0x250> 822c: e5823000 str r3, [r2] a += a / b; 8230: e59f302c ldr r3, [pc, #44]; 8264 <.text+0x244> 8234: ed931100 ldfs f1, [r3] 8238: e59f302c ldr r3, [pc, #44]; 826c <.text+0x24c> 823c: ed930100 ldfs f0, [r3] 8240: eea11100 fdvs f1, f1, f0 8244: e59f3018 ldr r3, [pc, #24]; 8264 <.text+0x244> 8248: ed930100 ldfs f0, [r3] 824c: ee010100 adfs f0, f1, f0 8250: e59f300c ldr r3, [pc, #12]; 8264 <.text+0x244> 8254: ed830100 stfs f0, [r3]
return 0; 8258: e3a03000 mov r3, #0; 0x0 Если я правильно понимаю, по адресу 8240 и 824с я получил то что и требовалось, осталось это слинковать
Сообщение отредактировал klen - May 30 2006, 04:54
|
|
|
|
|
May 30 2006, 14:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
ARM7TDMI и ARM926EJ-S суть разные ядра - http://www.chip-news.ru/archive/chipnews/200206/6.html - посему линкер просто обязан обругаться
--------------------
aka Vit
|
|
|
|
|
May 30 2006, 14:33
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(sensor_ua @ May 30 2006, 18:14)  ARM7TDMI и ARM926EJ-S суть разные ядра - http://www.chip-news.ru/archive/chipnews/200206/6.html - посему линкер просто обязан обругаться Вовсе нет. Если флаги заголовков секций объектников с точки зрения линкера совместимы, то он спокойно линкует. Просто в вышеприведенном случае с точки зрения линкера они не совместимы, но это связано не с ядрами напрямую. Цитирую приведенную Вами статью: Цитата Группа синтезируемых ядер ARM9E-S Thumb выделяется фирмой ARM в отдельное семейство. Они имеют расширения для поддержки алгоритмов цифровой обработки сигналов (DSP), в том числе умножитель-накопитель (MAC). В ядро может быть включен математический сопроцессор VFP9-S, поддерживающий операции с плавающей точкой над данными двойной точности. Т.е. сопроцессора может и не быть. Значит в этом случае будет использоваться эмуляция этих функций в стандартной библиотеке. А значит все объектные файлы должны иметь флаги типа "[FPA float format] [software FP]" и если некоторые их не имеют, то линкер на это будет ругаться. Что и происходит в вышеописанном случае.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
May 30 2006, 15:24
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(sensor_ua @ May 30 2006, 19:00)  Останусь при своём. Ещё предлагаю взглянуть на таблицу там же и увидеть, что ARM926EJ-S ещё и MMU имеет... Думаю, klen забыл поставить знак препинания - т.е. простенький пример не хочет линковаться после компиляции под соответствующий девайс (а не для одного ядра компилим, для другого линкуем). Такй глюк бывает, если линкеру в make не указать отдельно, опцию для какого девайса собирать - наблюдал на AVR-GCC-4 с binutils от WinAVR - ИМХО, похоже на то же. Что касается MMU, то компилятор про него не знает. Работа с MMU - дело программиста или ОС, под которую пишется софт. Флагов наличия/отсутствия MMU у целевого процессора в объектниках нет. Что касается предположения о выборе целевого девайса, то в ниже в письме идет простой пример, в котором один объектник собирается для arm7tdmi, а другой для arm926ejs. Оба этих объектника прекрасно линкуются с помощью arm-elf-ld: Цитата GNU ld version 2.15 Copyright 2002 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty. Файл f.c: Код int f( x ) { int i; int result = 0; for( i=0; i < x; ++i ) { result += result * x; } return result; } Файл main.c: Код extern int f( int x );
int main() { int a = f( 12 );
return a; } Файл Makefile: Код MAIN_CFLAGS := -mcpu=arm7tdmi -msoft-float -mlittle-endian -mapcs-32 -Wall F_CFLAGS := -mcpu=arm926ejs -msoft-float -mlittle-endian -mapcs-32 -Wall
all: main.o f.o arm-elf-ld -o output.elf $?
main.o : main.c arm-elf-gcc $(MAIN_CFLAGS) -c -o $@ $<
f.o : f.c arm-elf-gcc $(F_CFLAGS) -c -o $@ $<
clean: rm -f *.o *~ *.elf
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
May 30 2006, 16:00
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(sensor_ua @ May 30 2006, 19:42)  А кто писал либу для float, тот не программист что ли? Не ОС точно  И если есть такая вкусность, как MMU, то скучно её не использовать. В моем посте, который чуть выше, под программистом я понимал того, кто пользуется стандартной библиотекой языка и функциями поддержки, идущими вместе с компилятором (libgcc в данном случае). Т.е. он пришел на готовое.  В том числе и на ОС. Что же касается MMU, то не всегда он нужен, зависит от задач. В ряде случаев необходимость его использования может лишь создать дополнительные сложности. Но это уже не совсем по теме... Что же касается приведенного мною примера - работает?
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
May 30 2006, 16:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Что же касается приведенного мною примера - работает? wink.gif Я это называю "фунциклирует"
--------------------
aka Vit
|
|
|
|
|
May 30 2006, 17:37
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Пересобрал все - gcc binutils newlib c опцией --with-float=hard Компилятор начал ругатся по другому. Но после изучения исходникрв gcc и всяких док понял что нада еще опцию --mfpu=fpa добавить. Теперь все линкуется и под симулятором даже чето считается. Вобщем еще один шаг к постройке мегавычислителя я сделал  Но! Чето я совсем запутался. Суть моего понимания можно выразить так: 1. Аппаратная поддержка float это набор команд - fdvs fmls adfs sufs и тд. ПОДДЕРЖКА НЕ ЯДРОМ ARM!!! Тоесть существуют не ЯДРА!! а кристаллы в которых кроме ядра есть сопроцессоры которые поддержывают float (индекс "e" в названии "ядра" микросхемы) 2. VFP9 FPA MAVERIK и иже с ними в общем случае есть суть сопроцессоры со своим набором команд и форматом данных. Например в исходниках gcc я наше кусок который генерит команды процессора: cos sin fdvs fmls - чтоб они поддерживались кристалл должен содержать сопроцессор стандарта FPA версии 1. Или например команды fmuld fmscd ... - сопроцессор стандарта VFP версии 1d. 3. Именно поэтому нада опция --mfpu=fpa чтоб компиллер знал какой сопроцессор есть на борту (само ядро тут непричем) для указания множества допустимых команд, а линкеру для того чтоб он мог выбрать версию библиотек которая собрана с этим набором команд и сможет правильно слинковатся. Если я не прав поправте и поучите. Умные книги читать к сож. некогда. Учимся по исходникам компилятора. В итоге рытья мне удалось заставить компиллр гнать FP команды, но теперь косинус синус и тд эмулируется. Наверно опять с библиотеками нада рыть - не те подключает, или тех которые напрямую инструкции используют я не сказал ему собрать.
Сообщение отредактировал klen - May 30 2006, 17:42
|
|
|
|
|
May 30 2006, 18:35
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(klen @ May 30 2006, 21:37)  Но! Чето я совсем запутался. Суть моего понимания можно выразить так: 1. Аппаратная поддержка float это набор команд - fdvs fmls adfs sufs и тд. ПОДДЕРЖКА НЕ ЯДРОМ ARM!!! Тоесть существуют не ЯДРА!! а кристаллы в которых кроме ядра есть сопроцессоры которые поддержывают float (индекс "e" в названии "ядра" микросхемы) Для поддержки дополнительных команд к ядрам ARM добавляют сопроцессоры. Причем, что интересно, ряд функций самого ядра может управляться через эти самые команды сопроцессора (например, управление кешами и т.п.). Цитата 2. VFP9 FPA MAVERIK и иже с ними в общем случае есть суть сопроцессоры со своим набором команд и форматом данных. Например в исходниках gcc я наше кусок который генерит команды процессора: cos sin fdvs fmls - чтоб они поддерживались кристалл должен содержать сопроцессор стандарта FPA версии 1. Или например команды fmuld fmscd ... - сопроцессор стандарта VFP версии 1d. Да, насколько я понимаю, все именно так. Цитата 3. Именно поэтому нада опция --mfpu=fpa чтоб компиллер знал какой сопроцессор есть на борту (само ядро тут непричем) для указания множества допустимых команд, а линкеру для того чтоб он мог выбрать версию библиотек которая собрана с этим набором команд и сможет правильно слинковатся. Да, все правильно. Это нужно для определенности и избежания конфликтов.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
May 30 2006, 19:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Если я не прав поправте и поучите.  Сам бы поучился... А по сути - мне неясно, используется ли MMU в библиотеке float. При сборке библиотеки можно ведь было и разрешить... Как на такое должен отреагировать линкер?
--------------------
aka Vit
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|