|
|
  |
GCC перепутывает регистры на типе float |
|
|
|
Jan 10 2011, 19:03
|
Участник

Группа: Участник
Сообщений: 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 Че делать?
|
|
|
|
|
Jan 10 2011, 23:48
|
Участник

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

|
Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит
да и не только спринф, многие функции работаеют не так, ибо число другое получается
в буфере(gcc): 2D302E303030303030 (-0.000000) в буфере(iar): 35352E323030303030 (55.20000)
|
|
|
|
|
Jan 11 2011, 03:44
|

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

|
QUOTE б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора. Для ARM существует стандарт на передачу параметров - EABIQUOTE (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)
|
|
|
|
|
Jan 11 2011, 06:39
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 11 2011, 10:19
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 11 2011, 10:57
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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 поддерживается в вашей библиотеке?
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 11 2011, 11:09
|
Участник

Группа: Участник
Сообщений: 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 поддерживается в вашей библиотеке? гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает  Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда...
|
|
|
|
|
Jan 11 2011, 11:56
|
Участник

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

|
нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего
|
|
|
|
|
Jan 11 2011, 15:33
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 11 2011, 16:45
|
Участник

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

|
все, собрал свой гсс с таргетом arm-eabi все заработало. Всем спасибо!!!!
|
|
|
|
|
Jan 12 2011, 06:05
|

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

|
Цитата(vova7890 @ Jan 11 2011, 21:33)  Получил на выходе 55.20001, че 1 в конце? :-D Почитайте про формат IEE754 и обратите внимание на столбец Decimal digits в строке binary32 и сходите по ссылке binary32.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|