Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по ARM-GCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
klen
Решил я занятся изучением 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
sff
Я попытался откомпилировать со стандартного 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
makc
Цитата(klen @ May 29 2006, 23:19) *
Линкер говорит что обьектник собран с использованием команд FPA а сгениерить elf из этих объектников не хочет. В чем проблема?
Хочется глазками посмотреть в asm листингах инструкции счета плавающей запятой для arm926ej-s


Проблема во флагах объектных файлов: тех, которые в библиотеке и ваших, новособранных. Эти флаги, касающиеся FPA - не совпадают. Вот он и не линкует... Чтобы разобраться где и какие флаги установлены - воспользуйтесь утилитой arm-elf-objdump с соответствующими ключами. После этого нужно будет разобраться с ключиком компилятора -mfpu=...
klen
Цитата(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
sensor_ua
ARM7TDMI и ARM926EJ-S суть разные ядра -
http://www.chip-news.ru/archive/chipnews/200206/6.html -
посему линкер просто обязан обругаться
makc
Цитата(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]" и если некоторые их не имеют, то линкер на это будет ругаться. Что и происходит в вышеописанном случае.
sensor_ua
Останусь при своём. Ещё предлагаю взглянуть на таблицу там же и увидеть, что ARM926EJ-S ещё и MMU имеет...
Думаю, klen забыл поставить знак препинания - т.е. простенький пример не хочет линковаться после компиляции под соответствующий девайс (а не для одного ядра компилим, для другого линкуем). Такй глюк бывает, если линкеру в make не указать отдельно, опцию для какого девайса собирать - наблюдал на AVR-GCC-4 с binutils от WinAVR - ИМХО, похоже на то же.
makc
Цитата(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
sensor_ua
А кто писал либу для float, тот не программист что ли? Не ОС точноwink.gif И если есть такая вкусность, как MMU, то скучно её не использовать.
makc
Цитата(sensor_ua @ May 30 2006, 19:42) *
А кто писал либу для float, тот не программист что ли? Не ОС точно wink.gif И если есть такая вкусность, как MMU, то скучно её не использовать.


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

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

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

Я это называю "фунциклирует"
klen
Пересобрал все - 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 команды, но теперь косинус синус и тд эмулируется. Наверно опять с библиотеками нада рыть - не те подключает, или тех которые напрямую инструкции используют я не сказал ему собрать.
makc
Цитата(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 чтоб компиллер знал какой сопроцессор есть на борту (само ядро тут непричем) для указания множества допустимых команд, а линкеру для того чтоб он мог выбрать версию библиотек которая собрана с этим набором команд и сможет правильно слинковатся.


Да, все правильно. Это нужно для определенности и избежания конфликтов.
klen
Ну теперь ждем LPC3000 w00t.gif
Хрен с ним что он в BGA и флеша нет, всеравно хоцца!
sensor_ua
Цитата
Если я не прав поправте и поучите.

wink.gif Сам бы поучился...
А по сути - мне неясно, используется ли MMU в библиотеке float. При сборке библиотеки можно ведь было и разрешить... Как на такое должен отреагировать линкер?
makc
Цитата(sensor_ua @ May 30 2006, 23:13) *
Цитата
Если я не прав поправте и поучите.

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


MMU - memory management unit. При чем здесь библиотека float?
Вообще, MMU может выступать как сопроцессор (такой у него может быть интерфейс). Но от этого ничего не меняется. Т.е. любая прикладная библиотека в лучшем случае использует функции динамического распределения памяти, например, malloc, который, в свою очередь, опирается на более низкоуровневую функцию sbrk, которая может использовать MMU, а может оставлять работу по управлению MMU операционной системе (как это сделано, например, в Линуксе).

Да, конечно можно вручную сгородить дикий огород, когда функции управления MMU будут вызываться напрямую из некой библиотеки прикладного характера, но это довольно бесперспективный путь с точки зрения архитектуры все системы вцелом, т.к. существенно усложнит любую модификацию архитектуры, в т.ч. ее перенос на иную аппаратную платформу и расширение функционала.
klen
Цитата(makc @ May 30 2006, 23:32) *
MMU - memory management unit.

а че он умеет делать?
beer_warrior
Виртуальную память smile.gif
Собсно дает возможность нормально аппартно разделять адресное пространство для задач и ОС.
Необходимое условие для запуска полноценной операционки.
klen
Виртуальная память это здорово, для тех кто многозадачные осы делает. Я бы поменял этот модуль еще на один такойже сопроцессор плавающей запятой, а лучше на два...и чтоб они сразу матрицы перемножать умели бы smile.gif
makc
Цитата(klen @ May 31 2006, 00:52) *
Виртуальная память это здорово, для тех кто многозадачные осы делает. Я бы поменял этот модуль еще на один такойже сопроцессор плавающей запятой, а лучше на два...и чтоб они сразу матрицы перемножать умели бы smile.gif


На этот случай на шину процессора вешают ПЛИС, которая и занимается некоторыми ресурсоемкими задачами. В каком-то смысле, ПЛИС может выполнять функции сопроцессора.
sensor_ua
Цитата
Да, конечно можно вручную сгородить дикий огород, когда функции управления MMU будут вызываться напрямую из некой библиотеки прикладного характера


Именно. Грубо - вопрос конфигурации проекта (проекта библиотеки) - также как использовать аппаратный умножитель или нет (MSP430), использовать второй DPTR(C51) или нет.
ИМХО, библиотеки для конкретной ОС затачиваются под неё и предполагают использование "стандартного" для этой ОС конфига, иное описывается. Без ОС - что хочу, то ворочу - если можно выполнить вычисления быстрее, разумно воспользоваться моментомwink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.