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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Косяк GCC или мой? реализация LPC кодека под ARM7
krofork
сообщение Apr 28 2007, 06:14
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 15-12-06
Пользователь №: 23 530



Есть самописный LPC кодек, написан на С (переделанный OpenLPC).
Есть его конкретная реализация на ПК (моя dll + не мой GUI, C++Builder)
Есть его конкретная реализация под ARM7 (Keil в качестве IDE+ поставляемый с ним GCC)

Проблема в том, что со стороны ПК работает всё, а со стороны ARM только(!!!) кодирование. Процедура декодирования на ARM не работает (точнее она не корректно работает, проверялось отсылкой результатов по rs232 при обработке 1-го фиксированного кадра). С код кодека: процедур кодирования, декодирования, инициализации - абсолютно идентичен как для ПК, так и для ARM7.

Проц: ADuC7021
Компилятор: GCC3.1.1

правильно ли моё подозрение, что это косяк GCC?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 28 2007, 07:37
Сообщение #2


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



В принципе могут быть различия в тонкостях - например в упаковке структур и прочих прагмах.
А вообще надо смотреть подробнее.

P.S. В ходу уже gcc 4.1 попробуйте собрать свежим.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Ivan_Kov
сообщение Apr 28 2007, 09:48
Сообщение #3


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

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



Весьма вероятна следующая причина.

Для 80x86 - выравнивание пофигу.
А для ARM выравнивание - важно. Проц не может работать со словом, если оно не выровнено по границе 4 байт (2-х для 16-разрядного слова).

Так что поищите обращение к не выровненому слову.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 28 2007, 10:37
Сообщение #4


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Для 80x86 - выравнивание пофигу.А для ARM выравнивание - важно.

А простите каким образом АРМу попадут х86 бинарники?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 28 2007, 10:43
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Упаковка структур выполняется по разному для разных компиляторов.
У одних - это #pragma __packed, у GCC это типа так
struct zz {
int x;
char y
} __attribute__ ((packed));
Это может быть причиной неправильного приведения типов на подобие
struct zz *z = buf;
где buf массив байтов.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 28 2007, 11:14
Сообщение #6


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(beer_warrior @ Apr 28 2007, 11:37) *
А простите каким образом АРМу попадут х86 бинарники?

А на самом деле бинарники не нужны. Можно вполне устроить себе хорошую жизнь например вот так
Код
char buffer[256];
...
void doing_somthing_with_32bitarray(int *array, int size);
...
doing_somthing_with_32bitarray((int*)&buffer[43], 8);

хехе


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
krofork
сообщение Apr 28 2007, 12:01
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 15-12-06
Пользователь №: 23 530



поставил я значит GNUARM 4.1.1 вместо 3.1.1, теперь Keil материтcя:
....libaduc7024.a(irq.o) uses hardware FP, whereas ....elf uses software FP
когда он так матерился на startup я ему -mno-fp прописал, а тут куда чего он хочет?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 28 2007, 12:24
Сообщение #8


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
А на самом деле бинарники не нужны. Можно вполне устроить себе хорошую жизнь например вот так

Собсно мое первое предположение.

Цитата
когда он так матерился на startup я ему -mno-fp прописал, а тут куда чего он хочет?

Трудно сказать. А отедова сборку брали?
С Yagarto подобная ботва была, а с GNUARM все чики-пики.

Но самое главное проверьте все-таки Билдерские прагмы и ключи.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 28 2007, 13:04
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(krofork @ Apr 28 2007, 12:01) *
поставил я значит GNUARM 4.1.1 вместо 3.1.1, теперь Keil материтcя:
....libaduc7024.a(irq.o) uses hardware FP, whereas ....elf uses software FP
когда он так матерился на startup я ему -mno-fp прописал, а тут куда чего он хочет?

libaduc7024.a откуда? Если это не в комплекте GCC, то нужно ее пересобрать с software fp, или GCC с hardware fp.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
krofork
сообщение Apr 28 2007, 14:03
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 15-12-06
Пользователь №: 23 530



>libaduc7024.a откуда?

это из кейла - C:\Keil\ARM\INC\ADI\ - инклюды для аналог-девайсез процов smile.gif

Это же в GCC3.1.1 работало без подобных сообщений, да и не может ЭТО быть hardware FP, если это(libaduc7024.a) относится только к ADuC'ам у которых (насколько мне известно) ни одного нет этого hardware FP
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 28 2007, 14:16
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(krofork @ Apr 28 2007, 14:03) *
>libaduc7024.a откуда?

это из кейла - C:\Keil\ARM\INC\ADI\ - инклюды для аналог-девайсез процов smile.gif

Это же в GCC3.1.1 работало без подобных сообщений, да и не может ЭТО быть hardware FP, если это(libaduc7024.a) относится только к ADuC'ам у которых (насколько мне известно) ни одного нет этого hardware FP

libaduc7024.a - это библиотека, инклюды здесь ни при чем.
Скомпилирована она можеть быть с разными флагами.
Отсутствие FP, еще не факт, что нельзя скомпилировать файл с HWFP.
Суть в том, что объектник (как часть либы) содержит признаки HWFP (формат ELF).
Возможно есть библиотека libfloat.a. Возмодно нужно ее ипользовать или наоборот, не использовать.
В общем библиотеки, скомпилированые разными версиями GCC могут быть не совместимыми по признакам (флагам) ELF файлов. Как правило спасает перекомпиляци библиотеки.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 28 2007, 14:19
Сообщение #12


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Стоп, я че-то тормознул.
А зачем gcc специфичиские либы ADuCa?
Хидеры понятно - описание периферии. А вот зачем нечто компилированное?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 28 2007, 14:27
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Не важно, есть ли FP. Все зависит от ключей компиляции. Пример:
файл x.c
Код
void x()
{
}


Код
arm-elf-gcc -c -msoft-float -o xs.o x.c
arm-elf-gcc -c -mhard-float -o xh.o x.c

Дизассемблер файлов xs.o и xh.o дает одинаковый результат. А вот
Код
arm-elf-objdump -x xs.o

xs.o:     file format elf32-littlearm
xs.o
architecture: arm, flags 0x00000010:
HAS_SYMS
start address 0x00000000
private flags = 200: [APCS-32] [FPA float format] [software FP]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000010  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000044  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000044  2**0
                  ALLOC
  3 .comment      00000012  00000000  00000000  00000044  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
00000000 l    df *ABS*    00000000 x.c
00000000 l    d  .text    00000000
00000000 l    d  .data    00000000
00000000 l    d  .bss    00000000
00000000 l     F .text    00000000 $a
00000000 l    d  .comment    00000000
00000000 g     F .text    00000010 x

Код
arm-elf-objdump -x xh.o

xh.o:     file format elf32-littlearm
xh.o
architecture: arm, flags 0x00000010:
HAS_SYMS
start address 0x00000000
private flags = 0: [APCS-32] [FPA float format]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000010  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000044  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000044  2**0
                  ALLOC
  3 .comment      00000012  00000000  00000000  00000044  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
00000000 l    df *ABS*    00000000 x.c
00000000 l    d  .text    00000000
00000000 l    d  .data    00000000
00000000 l    d  .bss    00000000
00000000 l     F .text    00000000 $a
00000000 l    d  .comment    00000000
00000000 g     F .text    00000010 x

Обратите внимание на строчку private flags.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
krofork
сообщение Apr 28 2007, 14:30
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 15-12-06
Пользователь №: 23 530



в общем есть линкерный скрипт (взят из примера)
в котором есть строка INPUT(-laduc7024)
эта строка РАБОТАЛА с предыдущим GCC3.1.1.

Не уверен, но мне кажется (да, глупая фраза для инженера smile.gif ) что она нужна чтобы потом можно было сделать IRQ = MY_IRQ_FUNC;
Потому как если её удалть, то линкер матерится на нересолвенные ссылки, относящиеся к прерываниям
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 28 2007, 14:36
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(krofork @ Apr 28 2007, 14:30) *
в общем есть линкерный скрипт (взят из примера)
в котором есть строка INPUT(-laduc7024)
эта строка РАБОТАЛА с предыдущим GCC3.1.1.

Не уверен, но мне кажется (да, глупая фраза для инженера smile.gif ) что она нужна чтобы потом можно было сделать IRQ = MY_IRQ_FUNC;
Потому как если её удалть, то линкер матерится на нересолвенные ссылки, относящиеся к прерываниям

А что в этой библиотеке? Вы ее используете? Или Ваш IDE? Может она в Вашем случае не нужна?
Предполагаю, что там могут быть функции работы с периферией.

Попобуйте указать опцию -mhard-float

И покажите вывод команды
arm-elf-gcc -v
И желательно сравнить ее с предидущей версией.
Мой вариант:
Код
arm-elf-gcc -v
Reading specs from /usr/local/arm/lib/gcc-lib/arm-elf/3.3.6/specs
Configured with: /home/amw/devel/rdtt/arm7tdmi/src/gcc-3.3.6/configure --prefix=/usr/local/arm --disable-shared --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --target=arm-elf --with-cpu=arm7tdmi --enable-multilib --enable-interwork --disable-threads --enable-targets=arm-elf,thumb-elf --enable-languages=c --disable-nls
Thread model: single
gcc version 3.3.6

По умолчанию получается hard-float

Сообщение отредактировал amw - Apr 28 2007, 14:39


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:13
Рейтинг@Mail.ru


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