Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Flat в printf()! Как?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Шалапут:-)
Всем доброе время суток! Я переношу свой проект с СVAVR на GCC, в GCC возникла проблема с выводом значений с плавающей зяпятой:

float k=1.23;
printf ("d = %f",k);

при выводе получаю: d = ?
Тот же код работает в СVAVR, и не работает в ICC, только вместо знака вопроса выводит d = error
Помогите, плиз... smile3046.gif
SysRq
Use -lprintf_flt, Luke smile.gif

Правьте makefile, подключите floating point библиотеку.
Шалапут:-)
Цитата(SysRq @ Nov 24 2008, 13:36) *
Use -lprintf_flt, Luke smile.gif

Правьте makefile, подключите floating point библиотеку.


Спасибо, пробую!
demiurg_spb
Код
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB = $(PRINTF_LIB_FLOAT)

У меня попутный вопрос. А вот и онsmile.gif
Код
char *float_to_ASCII(float n, unsigned char dp)
{
    snprintf_P(ascii_str_buffer, 32, PSTR("%#.*f"), dp, n);  //ICCAVR ok  - в GCC не работает.
    return (ascii_str_buffer);                
}
Шалапут:-)
а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил.
demiurg_spb
Цитата(Шалапут:-) @ Nov 24 2008, 14:37) *
а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил.
Я же привёл кусок из Makefile - найди похожие строки и просто раскомментируй их
(м.б. придётся что-то закомментировать)...
Повторяю ещё раз:
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
msalov
Цитата(Шалапут:-) @ Nov 24 2008, 13:37) *
а use -lprintf_flt куда конкретно писать в мэйк файл? Библиотеку <float.h> подключил.

На этапе линковки компиляции добавлять (либо в $LDFLAGS в makefile-е, и не забыть добавить в коммандную строку). Пример ручного вызова:
Код
gcc some.c -o some.elf -lprintf_flt

Пример makefile-а
Код
CFLAGS= -Os
LDFLAGS= -lprintf_flt
OBJS= $(patsubst %.c,%.o,$(wildcard *.c))
.PHONY all
.c.o:
    gcc -c $< $(CFLAGS)
target: $(OBJS)
    gcc $^ -o $@ $(LDFLAGS)
all: target
Шалапут:-)
Цитата(demiurg_spb @ Nov 24 2008, 14:46) *
Я же привёл кусок из Makefile - найди похожие строки и просто раскомментируй их
(м.б. придётся что-то закомментировать)...
Повторяю ещё раз:
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB = $(PRINTF_LIB_FLOAT)

Я не нашёл даже похожих строк в мэйк файле. Пробовал вставлять в разные места мэйк файла, затем компилировать, но после компиляции внесённые мной изминения удалялись.
Также АВР студия выдаёт ворнинг о несовместимости типов:
../joreg.c:73: warning: format '%f' expects type 'double', but argument 2 has type 'float'

Ниже привожу свой мэйкфайл..
SysRq
Project\Configuration options, там слева Custom Options. Все необходимые ключи добавляются там, ежели вы используете makefile от AVRStudio.
demiurg_spb
Цитата(Шалапут:-) @ Nov 24 2008, 15:11) *
Ниже привожу свой мэйкфайл..
Минималистичненькоsmile.gif
Возьмите за основу WinAVR\sample\Makefile
SysRq
Цитата(demiurg_spb @ Nov 24 2008, 13:46) *
Код
snprintf_P(ascii_str_buffer, 32, PSTR("%#.*f"), dp, n);  //ICCAVR ok  - в GCC не работает.
Цитата
The variable width or precision field (an asterisk * symbol) is not realized and will to abort the output.
Шалапут:-)
Цитата(demiurg_spb @ Nov 24 2008, 15:33) *
Минималистичненькоsmile.gif
Возьмите за основу WinAVR\sample\Makefile

Взял за основу, сейчас редактирую.. посмотрим, что выйдет
demiurg_spb
Цитата
The variable width or precision field (an asterisk * symbol) is not realized and will to abort the output.
Обидно, досадно, ну да ладно...
Шалапут:-)
Цитата(demiurg_spb @ Nov 24 2008, 14:33) *
Минималистичненькоsmile.gif
Возьмите за основу WinAVR\sample\Makefile

Отредактировал Этот мэйкфайл, там действительно были закоментированы строки с "FLOAT", Сделал так:

# Floating point printf version (requires MATH_LIB = -lm below)

PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

# If this is left blank, then it will use the Standard printf version.
#PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
PRINTF_LIB = $(PRINTF_LIB_FLOAT)


MATH_LIB = -lm

Привязал внешний отредактированный мэйкфайл из студии, но эффект тот же.
Вместо значений выводится знак вопроса...
Вот пример:
Код
#include <stdio.h>
#include <float.h>
#include <math.h>
//...
float d =159.21;
printf ("%f\n",d);
printf("I am a Atmega16 MCU");

Результат:
?
I am a Atmega16 MCU
странно... почему так?

Может кто то поделится свим мэйкфайлом
попроще, с возможностью вывода float?..
А то я какой то необразованный... читал в книге Ю.А.Шпак, там используют GCC, так нет примеров с выводом float, как специально..

Ниже добавил отредактированный мэйкфайл, всё ещё неработающий..
SysRq
Цитата(Шалапут:-) @ Nov 26 2008, 00:46) *
Ниже добавил отредактированный мэйкфайл, всё ещё неработающий..
Cохранил его, добивил файл с кодом:
CODE
#include <avr\io.h>

#include <stdio.h>
#include <float.h>
#include <math.h>

static char str[20];

int main(void)
{
float d = 159.21;

sprintf(str, "%f\n", d);

for(;;)
{
static int i;
str[i++] = 0;
}
}

Из командной строки сказал make all, засунул .elf в AVRStudio и str добавил в watch. Работает, d отsprintf'илось в str.
demiurg_spb
Цитата(Шалапут:-) @ Nov 26 2008, 00:46) *
А то я какой то необразованный... читал в книге Ю.А.Шпак, там используют GCC, так нет примеров с выводом float, как специально..
Ниже добавил отредактированный мэйкфайл, всё ещё неработающий..

Попробуйте так:
make clean
make all
Шалапут:-)
Заработало!!!
Иногда так мало надо для счастья!!!
http://winavr.scienceprog.com/avr-gcc-tuto...in-avr-gcc.html
Сделал, как тут написано
Всем учасникам спасибо!!! Помогли мне!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.