vova7890 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба Пишу на гсс 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 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба Приведенные фрагменты кода ничего не поясняют и ничего не доказывают потому, что а) функция sprintf результат выводит в буфер, а не просто в регистры и б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора. Покажите конечный (якобы неправильный) результат разложения символов (байтов) в буфер(е). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит да и не только спринф, многие функции работаеют не так, ибо число другое получается в буфере(gcc): 2D302E303030303030 (-0.000000) в буфере(iar): 35352E323030303030 (55.20000) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора.Для ARM существует стандарт на передачу параметров - EABIда и не только спринф, многие функции работаеют не так, ибо число другое получаетсяА ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой? P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Забыл сказать, функция sprintf является прошивочной и от компилятора не зависитЭто не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении. да и не только спринф, многие функции работаеют не так, ибо число другое получается в буфере(gcc): 2D302E303030303030 (-0.000000) в буфере(iar): 35352E323030303030 (55.20000) Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 11 января, 2011 Опубликовано 11 января, 2011 (изменено) · Жалоба Для 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 ну и там линкер ещё.. Это не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении. ага, я догадывался Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой? приводил уже, первый пост - невидимка. char s[56]={0}; sprintf(s, "%f", 55.2); Изменено 11 января, 2011 пользователем vova7890 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба char s[56]={0}; sprintf(s, "%f", 55.2); скорректируйте до полного разжевывания компилятору: float a = 55.2; char s[50]; sprintf(&s[0], "%f", a); и проверить, что возвращает sprintf. А какая реализация sprintf поддерживается в вашей библиотеке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба скорректируйте до полного разжевывания компилятору: float a = 55.2; char s[50]; sprintf(&s[0], "%f", a); и проверить, что возвращает sprintf. А какая реализация sprintf поддерживается в вашей библиотеке? гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает :) Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда... :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vmp 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Может быть у gcc что-то в инклюдах про spintf прописано? Попробуйте для контроля обозвать вызываемую функцию по-другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба компиляю так: 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 0 11 января, 2011 Опубликовано 11 января, 2011 (изменено) · Жалоба Товарисч, 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' Изменено 11 января, 2011 пользователем vova7890 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vova7890 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба все, собрал свой гсс с таргетом arm-eabi все заработало. Всем спасибо!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Получил на выходе 55.20001, че 1 в конце? :-DПочитайте про формат IEE754 и обратите внимание на столбец Decimal digits в строке binary32 и сходите по ссылке binary32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться