реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопрос по ARM-GCC, arm7tdmi все ок, arm926ej-s не хотит :(
klen
сообщение May 29 2006, 19:19
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sff
сообщение May 29 2006, 20:02
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
makc
сообщение May 30 2006, 04:19
Сообщение #3


Гуру
******

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



Цитата(klen @ May 29 2006, 23:19) *
Линкер говорит что обьектник собран с использованием команд FPA а сгениерить elf из этих объектников не хочет. В чем проблема?
Хочется глазками посмотреть в asm листингах инструкции счета плавающей запятой для arm926ej-s


Проблема во флагах объектных файлов: тех, которые в библиотеке и ваших, новособранных. Эти флаги, касающиеся FPA - не совпадают. Вот он и не линкует... Чтобы разобраться где и какие флаги установлены - воспользуйтесь утилитой arm-elf-objdump с соответствующими ключами. После этого нужно будет разобраться с ключиком компилятора -mfpu=...


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
klen
сообщение May 30 2006, 04:36
Сообщение #4


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 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с я получил то что и требовалось, осталось это слинковатьsmile.gif

Сообщение отредактировал klen - May 30 2006, 04:54
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 30 2006, 14:14
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



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


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
makc
сообщение May 30 2006, 14:33
Сообщение #6


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 30 2006, 15:00
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Останусь при своём. Ещё предлагаю взглянуть на таблицу там же и увидеть, что ARM926EJ-S ещё и MMU имеет...
Думаю, klen забыл поставить знак препинания - т.е. простенький пример не хочет линковаться после компиляции под соответствующий девайс (а не для одного ядра компилим, для другого линкуем). Такй глюк бывает, если линкеру в make не указать отдельно, опцию для какого девайса собирать - наблюдал на AVR-GCC-4 с binutils от WinAVR - ИМХО, похоже на то же.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
makc
сообщение May 30 2006, 15:24
Сообщение #8


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 30 2006, 15:42
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



А кто писал либу для float, тот не программист что ли? Не ОС точноwink.gif И если есть такая вкусность, как MMU, то скучно её не использовать.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
makc
сообщение May 30 2006, 16:00
Сообщение #10


Гуру
******

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



Цитата(sensor_ua @ May 30 2006, 19:42) *
А кто писал либу для float, тот не программист что ли? Не ОС точно wink.gif И если есть такая вкусность, как MMU, то скучно её не использовать.


В моем посте, который чуть выше, под программистом я понимал того, кто пользуется стандартной библиотекой языка и функциями поддержки, идущими вместе с компилятором (libgcc в данном случае). Т.е. он пришел на готовое. smile.gif В том числе и на ОС.

Что же касается MMU, то не всегда он нужен, зависит от задач. В ряде случаев необходимость его использования может лишь создать дополнительные сложности. Но это уже не совсем по теме...

Что же касается приведенного мною примера - работает? wink.gif


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 30 2006, 16:09
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Что же касается приведенного мною примера - работает? wink.gif

Я это называю "фунциклирует"


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
klen
сообщение May 30 2006, 17:37
Сообщение #12


бессмертным стать можно тремя способами
*****

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



Пересобрал все - gcc binutils newlib c опцией --with-float=hard
Компилятор начал ругатся по другому.
Но после изучения исходникрв gcc и всяких док понял что нада еще опцию --mfpu=fpa добавить. Теперь все линкуется и под симулятором даже чето считается.
Вобщем еще один шаг к постройке мегавычислителя я сделал smile.gif

Но!
Чето я совсем запутался. Суть моего понимания можно выразить так:
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
Go to the top of the page
 
+Quote Post
makc
сообщение May 30 2006, 18:35
Сообщение #13


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
klen
сообщение May 30 2006, 18:57
Сообщение #14


бессмертным стать можно тремя способами
*****

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



Ну теперь ждем LPC3000 w00t.gif
Хрен с ним что он в BGA и флеша нет, всеравно хоцца!

Сообщение отредактировал klen - May 30 2006, 18:58
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение May 30 2006, 19:13
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Если я не прав поправте и поучите.

wink.gif Сам бы поучился...
А по сути - мне неясно, используется ли MMU в библиотеке float. При сборке библиотеки можно ведь было и разрешить... Как на такое должен отреагировать линкер?


--------------------
aka Vit
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 00:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016