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

 
 
> Не могу преобразовать double в строку, Преобразование типов в WinAVR
Sminder
сообщение Mar 9 2007, 00:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 26-02-07
Пользователь №: 25 691



Возникла такая проблема: для вывода на индикатор требуется строчная переменная (*char) вида
Х.ХХХ, а имеется полученная в результате вычислений переменная типа double (т.е. с плавающей запятой). Как я понял, в компиляторе WinAVR не имеется встроенных средств для преобразования чисел с плавающей запятой в строку. Пожалуйста, дайте ссылку или приведите пример такого преобразования.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
beer_warrior
сообщение Mar 14 2007, 01:08
Сообщение #2


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

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



2 aesok
Анатолий, там ИМХО проблема с libc/libgcc. К сожалению слабо представляю как они коррелируют между собой, но libm здесь ИМХО непричем. В этом случае ругнулось бы на undefined function.

Тут два варианта - либо это очередная кривизна winavr2007, либо IDE подсовывает либу линкеру дважды. Исключить второе поможет билд из командной строки. Если при этом линкер заругается опять, то тогда откатыватся на старую версию (2006). Я так понял, вы ей активно пользуетесь, она надежна и очищена от старья?


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


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(beer_warrior @ Mar 14 2007, 01:08) *
2 aesok
Анатолий, там ИМХО проблема с libc/libgcc. К сожалению слабо представляю как они коррелируют между собой, но libm здесь ИМХО непричем. В этом случае ругнулось бы на undefined function.

Тут два варианта - либо это очередная кривизна winavr2007, либо IDE подсовывает либу линкеру дважды. Исключить второе поможет билд из командной строки. Если при этом линкер заругается опять, то тогда откатыватся на старую версию (2006). Я так понял, вы ей активно пользуетесь, она надежна и очищена от старья?


Дело в том что в GCC две версии библиотеки для чисел с плавающей точкой (я говорю только про сложение, вычитание, ..., сравнение, преобразование типов). Одна находиться в стандартной библиотеке компилятора в libgcc.а. Недостаток этой версии в том что эти функции написаны на C, и имеют большой размер кода и время выполнения. Но GCC должен иметь эти функции в стандартной библиотеке. float - это стандартный 'С' тип, и компилятор должен всегда быть готовым сгенерировать код для умножения двух float переменных.

Есть еще один набор тех же самых функций, но написанных на ассемблере, тоесть оптимизированных по скорости и размеру. Эти функции находятся в avr-libc, а физически в библиотеке libm.a. Для того чтобы использовались оптимизированные функции и нужно прилинковать библиотеку libm.a с помощью опции линкера -lm. (кстати в вашем примере этот ключ есть).

Код
avr-gcc -mmcu=atmega162 -adhlns=main.o -std=c99 -main.o --output main.elf [b]-lm[/b]


У Sminder-а возникла следующая проблема: он собирает проект без опции -lm и некоторые модули функцию `__fixsfsi' из libgcc.а. Что эта версия функции не эффективна это только пол проблемы. А основная проблема в том что 'dtostrf' функция из avr-libc и использует `__fixsfsi' из libm.a. Ну и компоновщик не может добавить в проект две функции с одним именем.

К сожалению я не понял как в AVRStudio как по-человечески добавить libm, и поэтому предложил такой способ.

Анатолий.

PS: Мое мнение такое: если у вас меньше 64 кб кода то торопиться переходить на winavr2007 смысла нет.

Сообщение отредактировал aesok - Mar 14 2007, 02:35
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sminder   Не могу преобразовать double в строку   Mar 9 2007, 00:55
- - beer_warrior   ftoa() по-моему нет, но ИМХО она не предусмотрена ...   Mar 9 2007, 01:56
- - vooon   просмотрите stdlib.h внимательно, я там например н...   Mar 9 2007, 01:59
|- - Sminder   Цитата(vooon @ Mar 9 2007, 00:59) просмот...   Mar 11 2007, 16:16
- - beer_warrior   Похоже на двойное включение одной и той же библиот...   Mar 11 2007, 16:23
|- - Sminder   Цитата(beer_warrior @ Mar 11 2007, 15:23)...   Mar 13 2007, 00:14
|- - aesok   makefile ваш, или тот что AVRStudio генерирует авт...   Mar 13 2007, 00:34
- - beer_warrior   ЦитатаСообщения действительно говорят о множествен...   Mar 13 2007, 08:17
|- - Sminder   Пардон, оговорился, я имел в виду конечно определе...   Mar 13 2007, 22:35
|- - aesok   Цитата(Sminder @ Mar 13 2007, 22:35) Make...   Mar 14 2007, 00:10
- - beer_warrior   Ну что тут можно сказать. Оба мэйкфайла к осмотру....   Mar 13 2007, 23:09
- - beer_warrior   ЦитатаУ Sminder-а возникла следующая проблема: он ...   Mar 14 2007, 03:09
|- - aesok   WinAVR 2006. Код: Код#include <stdlib.h> ...   Mar 14 2007, 13:41
|- - aesok   Цитата(beer_warrior @ Mar 14 2007, 03:09)...   Mar 15 2007, 00:10
- - neonix   На данный момент WinAVR 2007 не пригоден для испол...   Mar 14 2007, 12:20
- - Sminder   Огромное спасибо aesok, ваш совет действительно по...   Mar 17 2007, 21:37


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

 


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


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