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

 
 
 
Reply to this topicStart new topic
> GCC перепутывает регистры на типе float
vova7890
сообщение Jan 10 2011, 19:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Пишу на гсс 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


Че делать?


Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 10 2011, 20:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Приведенные фрагменты кода ничего не поясняют и ничего не доказывают потому, что
а) функция sprintf результат выводит в буфер, а не просто в регистры и
б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора.
Покажите конечный (якобы неправильный) результат разложения символов (байтов) в буфер(е).
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 10 2011, 23:48
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит

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

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

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 11 2011, 03:44
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alx2
сообщение Jan 11 2011, 06:39
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



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

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

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

Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой?


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 11 2011, 10:19
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Цитата(Сергей Борщ @ 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);

Сообщение отредактировал vova7890 - Jan 11 2011, 10:54
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 11 2011, 10:57
Сообщение #7


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(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 поддерживается в вашей библиотеке?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 11 2011, 11:09
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



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

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


гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает sm.gif Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда... crying.gif
Go to the top of the page
 
+Quote Post
vmp
сообщение Jan 11 2011, 11:40
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Может быть у gcc что-то в инклюдах про spintf прописано?
Попробуйте для контроля обозвать вызываемую функцию по-другому.
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 11 2011, 11:56
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 11 2011, 14:44
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(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
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 11 2011, 15:33
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Цитата(_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 - Jan 11 2011, 15:14
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 11 2011, 16:45
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



все, собрал свой гсс с таргетом arm-eabi все заработало. Всем спасибо!!!!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 12 2011, 06:05
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(vova7890 @ Jan 11 2011, 21:33) *
Получил на выходе 55.20001, че 1 в конце? :-D
Почитайте про формат IEE754 и обратите внимание на столбец Decimal digits в строке binary32 и сходите по ссылке binary32.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:50
Рейтинг@Mail.ru


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