ЗАО «ЗЭО»

Техническая поддержка пользователей => Тион, Тион-Про, Тион-Про v2, Сириус => Тема начата: MOHOMAX от 17 Мая, 2011, 16:36:20

Название: работа с плавающей точкой
Отправлено: MOHOMAX от 17 Мая, 2011, 16:36:20
Здравствуйте!
У меня проблема при работе с данными типа float или double.
Проблема проявляется несколькими способами:

1. При попытке распознать строку и вытащить из неё значение, значение возвращается неадекватное:
например:
char str[20]="23.31";
char *ptr;
float res;

res=strtof(str,0);
printf("%f\n",res); // выводится значение что то вроде 100002003999383813444421091888.32989018738974897134987

то же самое если использовать
sscanf(str, "%f",&res);


2. При преобразовании типа:
float f=12.3;
int i=(int)f; // i получаем не 12

Причем этот же самый код на PC-шном линуксе работает замечательно. Почему такое может быть?

Тион-про2, linux, КФС от buildroot
Название: Re: работа с плавающей точкой
Отправлено: asv от 18 Мая, 2011, 18:15:36
> Причем этот же самый код на PC-шном линуксе работает замечательно. Почему такое может быть?

У меня он на PC замечательно не работает.

При сборке с флагом -Wall есть сообщение "warning: implicit declaration of function 'strtof'" ?

Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 20 Мая, 2011, 02:44:16
В аттаче пример программы, на которой проявляется баг.
Вот её полный текст:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char str[] = "2334.45";
    char *ptr;
    float f;

    f = strtof(str, &ptr);

    printf("strtof extracted f=%f\n", f);

    sscanf(str,"%f",&f);
    printf("sscanf extracted f=%f\n", f);

    if(f<2334.451 && f>2334.44)
    {
        printf("f is correct, int=%d\n",(int)f);
    }

    return 0;
}
Собираю программу командой:
/usr/local/arm/4.3.4-armv4t-arm920t-eabi/usr/bin/arm-linux-gcc -Wall -o test test.c

Программа, запущенная на тионе выводит:
Цитировать
# ./test
strtof extracted f=26815622316534459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
sscanf extracted f=26815622316534459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
f is correct, int=2334
#
Судя по всему глючит printf. Но вроде все верно печатаю, разве нет?
Название: Re: работа с плавающей точкой
Отправлено: asv от 20 Мая, 2011, 10:29:10
Соберите со -static и попробуйте
Название: Re: работа с плавающей точкой
Отправлено: asv от 20 Мая, 2011, 12:37:23
У меня так (и без -static)

./a.out                                                                       
strtof extracted f=2334.449951                                                 
sscanf extracted f=2334.449951                                                 
f is correct, int=2334

Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 20 Мая, 2011, 23:31:43
со -static у меня программа вообще не запускается:
/usr/local/arm/4.3.4-armv4t-arm920t-eabi/usr/bin/arm-linux-gcc -static -Wall -o test test.c
# ./test
Illegal instruction
#

если собирать с -static-libgcc, то программа запускается, но проблема не исчезает.

А вы на какой платформе запускаете?
Название: Re: работа с плавающей точкой
Отправлено: asv от 20 Мая, 2011, 23:42:34
> # ./test
> Illegal instruction

У вас видимо на плате что-то не то записано. Покажите что в /lib


> А вы на какой платформе запускаете?

armv4 eabi, ep9315
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 21 Мая, 2011, 00:40:05
# cd /lib/
# ls
firmware                libdl-0.9.30.3.so       libnsl-0.9.30.3.so      librt-0.9.30.3.so
ld-uClibc-0.9.30.3.so   libdl.so.0              libnsl.so.0             librt.so.0
ld-uClibc.so.0          libgcc_s.so             libpthread-0.9.30.3.so  libuClibc-0.9.30.3.so
libc.so.0               libgcc_s.so.1           libpthread.so.0         libutil-0.9.30.3.so
libcrypt-0.9.30.3.so    libm-0.9.30.3.so        libresolv-0.9.30.3.so   libutil.so.0
libcrypt.so.0           libm.so.0               libresolv.so.0          modules
#
Название: Re: работа с плавающей точкой
Отправлено: asv от 21 Мая, 2011, 12:17:15
Вы на плате меняли ядро или только КФС?
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 21 Мая, 2011, 15:03:42
менял и ядро и КФС. Ядро патчил и собирал тулчейном (4.3.4-armv4t-arm920t-eabi), КФС при помощи билдрута.

Цитировать
# uname -a
Linux tion 2.6.20.21 #4 PREEMPT Mon May 2 13:05:53 MSD 2011 armv4tl GNU/Linux
Название: Re: работа с плавающей точкой
Отправлено: asv от 23 Мая, 2011, 20:09:35
> менял и ядро и КФС

Давайте .config ядра и .config Buildroot'а
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 23 Мая, 2011, 22:05:14
Linux/linux-2.6.20.21/.config
buildroot-2009.08-rc3/.br_config
Название: Re: работа с плавающей точкой
Отправлено: asv от 25 Мая, 2011, 21:05:30
Linux/linux-2.6.20.21/.config
# CONFIG_AEABI is not set

buildroot-2009.08-rc3/.br_config
# BR2_ARM_EABI is not set

И как вы хотите собирать с EABI? Используйте или компилятор из собранного вами Buildroot или перенастраивайте на EABI.
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 30 Мая, 2011, 10:11:32
да, я накосячил... спасибо, что указали где искать проблему.
Пересобрал и КФС и ядро с EABI. Теперь если собирать пример с ключем -static, то все работает, но если ключ убрать, то проблема остается. Подскажите, пожалуйста, с чем это связано?
Название: Re: работа с плавающей точкой
Отправлено: asv от 30 Мая, 2011, 17:31:06
Вы заменили на плате КФС?
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 30 Мая, 2011, 17:58:57
да, заменил на плате и КФС и ядро... все собрано с EABI
Название: Re: работа с плавающей точкой
Отправлено: asv от 30 Мая, 2011, 17:59:41
Напишите как вы заменяли КФС
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 30 Мая, 2011, 20:18:17
У меня скачен билдрут и использую стандартный дефконфиг для тиона (билдрут + патч), который выложен на вашем сайте
1. В билдрут зашел в make menuconfig и установил target ABI EABI
2. выполнил команду make BOARD=tion
3. Получил файл rootfs.arm.jffs
4. Зашел в uboot на тионе, и выполнил следующие операции (tftp настроен):
tftpboot 0 rootfs.arm.jffs
protect off all
erase 60300000 +$jffs_size
cp.b 0 60300000
saveenv // чтобы сохранить переменные uboot, которые мы потерли
boot

может какие-то мелочи не написал. Если надо, могу более подробно описать что надо
Название: Re: работа с плавающей точкой
Отправлено: asv от 01 Июня, 2011, 15:55:52
> 1. В билдрут зашел в make menuconfig и установил target ABI EABI

Сборку вы выполняли заново, т.е. в другой директории, или после make distclean?
Скопировали local/tion/tion.config как .config?

> 2. выполнил команду make BOARD=tion
>3. Получил файл rootfs.arm.jffs
>4. Зашел в uboot на тионе, и выполнил следующие операции (tftp настроен):

Какое значение у jffs_size? Плата Тион?
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 02 Июня, 2011, 00:05:40
>Сборку вы выполняли заново, т.е. в другой директории, или после make distclean?
make distclean я не делал, просто пересобрал проект

>Скопировали local/tion/tion.config как .config?
Изначально я скачал билдрут, применил патч, скопировал  local/tion/tion.config как .config и собрал предыдущую версию КФС. После того, как вы посоветовали использовать EABI, я просто в make menuconfig выбрал EABI и пересобрал КФС. make distclean я не делал.


> Какое значение у jffs_size? Плата Тион?
jffs_size=3d00000. Плата тион про2.
Название: Re: работа с плавающей точкой
Отправлено: asv от 02 Июня, 2011, 00:49:40
> make distclean я не делал, просто пересобрал проект

Придется делать заново.
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 03 Июня, 2011, 00:02:11
выполнил make distclean в билдруте, пересобрал КФС "по новой", пепепрошил КФС тиона. Но проблема такая же. Со -static пример работает, без статика - мусор.
Название: Re: работа с плавающей точкой
Отправлено: asv от 06 Июня, 2011, 13:51:06
Пробуйте

1. КФС
http://www.zao-zeo.ru/media/files/rootfs/ep93xx/buildroot/rootfs.arm_br2009.08_eabi_g8aa091c22524e3c4dae41213b7405d1b892418d3.jffs
http://www.zao-zeo.ru/media/files/rootfs/ep93xx/buildroot/rootfs.arm_br2009.08_eabi_g8aa091c22524e3c4dae41213b7405d1b892418d3.ext2.gz

2. Ядро
http://www.zao-zeo.ru/media/files/linux/2.6.20/image/uImage-2.6.20.21_tion-pro2_svn1522_eabi


jffs_size=3d00000. Плата тион про2.

В U-Boot 2010.09 для Тион-Про2 jffs_size=3c80000
(последние 4-ре 0x10000 сектора не используются для КФС,
и последние 2 из них используются для двух копий переменных
окружения U-Boot'а).


Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 07 Июня, 2011, 00:21:22
достаточно было перепрошить КФС на тот, который вы указали, и проблема исчезла. Я так понимаю проблема в некорректной сборке КФС. Можете скинуть конфиг для билдута, которым вы собирали КФС?
Название: Re: работа с плавающей точкой
Отправлено: asv от 07 Июня, 2011, 09:55:24
Он (кроме пары отключённых программ) точно такой же как и в
http://zao-zeo.ru/media/files/linux/buildroot-2009.08.git
local/tion/tion.config

Для уверенности прилагаю.
Название: Re: работа с плавающей точкой
Отправлено: MOHOMAX от 08 Июня, 2011, 00:41:49
Проблема решена!
Единственное существенное отличие конфигфайлов (вашего и моего) - версия используемого билдрута. Я использовал билдрут buildroot-2009.08-rc3, вы испольуете buildroot-2009.08. Я скачал buildroot-2009.08, собрал КФС с использованием EABI и проблема на тионе пропала.

Спасибо!