ЗАО «ЗЭО»
Техническая поддержка пользователей => Тион, Тион-Про, Тион-Про v2, Сириус => Тема начата: 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
-
> Причем этот же самый код на PC-шном линуксе работает замечательно. Почему такое может быть?
У меня он на PC замечательно не работает.
При сборке с флагом -Wall есть сообщение "warning: implicit declaration of function 'strtof'" ?
-
В аттаче пример программы, на которой проявляется баг.
Вот её полный текст:
#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. Но вроде все верно печатаю, разве нет?
-
Соберите со -static и попробуйте
-
У меня так (и без -static)
./a.out
strtof extracted f=2334.449951
sscanf extracted f=2334.449951
f is correct, int=2334
-
со -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, то программа запускается, но проблема не исчезает.
А вы на какой платформе запускаете?
-
> # ./test
> Illegal instruction
У вас видимо на плате что-то не то записано. Покажите что в /lib
> А вы на какой платформе запускаете?
armv4 eabi, ep9315
-
# 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
#
-
Вы на плате меняли ядро или только КФС?
-
менял и ядро и КФС. Ядро патчил и собирал тулчейном (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
-
> менял и ядро и КФС
Давайте .config ядра и .config Buildroot'а
-
Linux/linux-2.6.20.21/.config
buildroot-2009.08-rc3/.br_config
-
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.
-
да, я накосячил... спасибо, что указали где искать проблему.
Пересобрал и КФС и ядро с EABI. Теперь если собирать пример с ключем -static, то все работает, но если ключ убрать, то проблема остается. Подскажите, пожалуйста, с чем это связано?
-
Вы заменили на плате КФС?
-
да, заменил на плате и КФС и ядро... все собрано с EABI
-
Напишите как вы заменяли КФС
-
У меня скачен билдрут и использую стандартный дефконфиг для тиона (билдрут + патч), который выложен на вашем сайте
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
может какие-то мелочи не написал. Если надо, могу более подробно описать что надо
-
> 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? Плата Тион?
-
>Сборку вы выполняли заново, т.е. в другой директории, или после 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.
-
> make distclean я не делал, просто пересобрал проект
Придется делать заново.
-
выполнил make distclean в билдруте, пересобрал КФС "по новой", пепепрошил КФС тиона. Но проблема такая же. Со -static пример работает, без статика - мусор.
-
Пробуйте
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'а).
-
достаточно было перепрошить КФС на тот, который вы указали, и проблема исчезла. Я так понимаю проблема в некорректной сборке КФС. Можете скинуть конфиг для билдута, которым вы собирали КФС?
-
Он (кроме пары отключённых программ) точно такой же как и в
http://zao-zeo.ru/media/files/linux/buildroot-2009.08.git
local/tion/tion.config
Для уверенности прилагаю.
-
Проблема решена!
Единственное существенное отличие конфигфайлов (вашего и моего) - версия используемого билдрута. Я использовал билдрут buildroot-2009.08-rc3, вы испольуете buildroot-2009.08. Я скачал buildroot-2009.08, собрал КФС с использованием EABI и проблема на тионе пропала.
Спасибо!