Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC перепутывает регистры на типе float
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
vova7890
Пишу на гсс 4.5.2.Кароче заметил что спринтф не правильно схавал флоат, я отдизасмил и сравнил с дизасмом иара

char s[56]={0};
sprintf(s, "%f", 55.2);

дизасм гсс:
Код
                MOV     R0, SP
                LDR     R1, =unk_4A6
                LDR     R2, =0x404B9999
                LDR     R3, =0x9999999A


дизасм иара:
Код
                LDR     R3, =0x404B9999
                LDR     R2, =0x9999999A
                MOV     R0, SP
                ADR     R1, dword_58


как видно регистры R2 R3 перепутаны.

LDR R2, =0x404B9999
LDR R3, =0x9999999A

LDR R3, =0x404B9999
LDR R2, =0x9999999A


Че делать?


rezident
Приведенные фрагменты кода ничего не поясняют и ничего не доказывают потому, что
а) функция sprintf результат выводит в буфер, а не просто в регистры и
б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора.
Покажите конечный (якобы неправильный) результат разложения символов (байтов) в буфер(е).
vova7890
Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит

да и не только спринф, многие функции работаеют не так, ибо число другое получается

в буфере(gcc): 2D302E303030303030 (-0.000000)
в буфере(iar): 35352E323030303030 (55.20000)

Сергей Борщ
QUOTE
б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора.
Для ARM существует стандарт на передачу параметров - EABI
QUOTE (vova7890 @ Jan 11 2011, 04:48) *
да и не только спринф, многие функции работаеют не так, ибо число другое получается
А ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой?

P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа.
alx2
Цитата(vova7890 @ Jan 11 2011, 07:48) *
Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит
Это не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении.

Цитата(vova7890 @ Jan 11 2011, 07:48) *
да и не только спринф, многие функции работаеют не так, ибо число другое получается

в буфере(gcc): 2D302E303030303030 (-0.000000)
в буфере(iar): 35352E323030303030 (55.20000)

Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой?
vova7890
Цитата(Сергей Борщ @ Jan 11 2011, 09:44) *
Для ARM существует стандарт на передачу параметров - EABIА ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой?

P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа.


И шож там такого безграмотного? Если вы невнимательно читали, то я тут при чем?
Видимо никто не читал первый пост, я ж написал GCC 4.5.2!
компиляю так:
arm-elf-gcc -c -msoft-float -mlittle-endian -mcpu=arm926ej-s -Os -I include -nostdlib -fwide-exec-charset=cp1251 main.c
ну и там линкер ещё..

Цитата(alx2 @ Jan 11 2011, 12:39) *
Это не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении.


ага, я догадывался

Цитата(alx2 @ Jan 11 2011, 12:39) *
Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой?


приводил уже, первый пост - невидимка.

char s[56]={0};
sprintf(s, "%f", 55.2);
mdmitry
Цитата(vova7890 @ Jan 11 2011, 16:19) *
char s[56]={0};
sprintf(s, "%f", 55.2);


скорректируйте до полного разжевывания компилятору:
Код
float  a = 55.2;
char s[50];
sprintf(&s[0], "%f", a);

и проверить, что возвращает sprintf.
А какая реализация sprintf поддерживается в вашей библиотеке?
vova7890
Цитата(mdmitry @ Jan 11 2011, 16:57) *
скорректируйте до полного разжевывания компилятору:
Код
float  a = 55.2;
char s[50];
sprintf(&s[0], "%f", a);

и проверить, что возвращает sprintf.
А какая реализация sprintf поддерживается в вашей библиотеке?


гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает sm.gif Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда... crying.gif
vmp
Может быть у gcc что-то в инклюдах про spintf прописано?
Попробуйте для контроля обозвать вызываемую функцию по-другому.
vova7890
нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего
_Pasha
Цитата(vova7890 @ Jan 11 2011, 17:19) *
компиляю так:
arm-elf-gcc -c -msoft-float -mlittle-endian -mcpu=arm926ej-s -Os -I include -nostdlib -fwide-exec-charset=cp1251 main.c
ну и там линкер ещё..

Товарисч, arm-none-eabi-gcc-4.5.2.exe(т.е. то, чего советовали) это немного не arm-elf-gcc
vova7890
Цитата(_Pasha @ Jan 11 2011, 20:44) *
Товарисч, arm-none-eabi-gcc-4.5.2.exe(т.е. то, чего советовали) это немного не arm-elf-gcc


а вы товарисч предлагает использовать arm-none-eabi-gcc-4.5.2.elf?(линукс) И че как бы гсс не по стандартам еаби собирает? Де скачать на линукс?

скачал первое что нашел гсс старый arm-unknown-linux-gnueabi-gcc-4.1.1

скомпилял и уррррраааа!!!! Почти :-D

Получил на выходе 55.20001, че 1 в конце? :-D

дайте ссылку пожалуйста, не могу найти (

Нашел arm-none-eabi последней версии, начал компилять, он ругнулся на конструкцию с asm("swi NUMBER"); В чем фишка?

Код
static inline long do_SWI0(const int swi_num )
{
    long ret_val;

    asm volatile (
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num)

        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );

    return ret_val;
}


include/swiadd.h: In function 'do_SWI0':
include/swiadd.h:35:2: warning: asm operand 1 probably doesn't match constraints
include/swiadd.h:35:2: error: impossible constraint in 'asm'

vova7890
все, собрал свой гсс с таргетом arm-eabi все заработало. Всем спасибо!!!!
demiurg_spb
Цитата(vova7890 @ Jan 11 2011, 21:33) *
Получил на выходе 55.20001, че 1 в конце? :-D
Почитайте про формат IEE754 и обратите внимание на столбец Decimal digits в строке binary32 и сходите по ссылке binary32.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.