floating point 관련 질문 - ARM926
안녕하세요..
Floating point 관련하여 버그가 있는 것 같은데, 원인을 잘 알수가 없어 문의 드립니다.
먼저 개발환경은,
ARM926 CPU 에, CodeSourcery Toolchain을 사용하고 있습니다. (GCC 4.5.2)
현상은....
main(){
float aaa = 1.0f;
printf("FLOAT PRINT TEST : %f\n", aaa);
}
static char _print_buf[512];
void print(int flag, const char *fmt, ...)
{
va_list arg_ptr;
int len;
va_start(arg_ptr, fmt);
len = vsnprintf(_print_buf, 512, fmt, arg_ptr);
uart_puts(_print_buf);
va_end(arg_ptr);
}
위와 같은 코드를 실행하면, printf의 결과가
FLOAT PRINT TEST : -50426381400446635931683074912708695969843206211256012635925909276830878315952142264016167979804352772672560410340856600198308725445182824765337736743653896482634558304093685245684414025294759544793063673601035720383454846661266752623320919661041628249378295971315712.000000
이런식으로 황당하게 나옵니다 :)
혹시 이런문제를 겪어 보신분 계시면, 도움을 좀 부탁드립니다~~
컴파일러에서 부동 소수점 연산을 지원하지 않는 것
컴파일러에서 부동 소수점 연산을 지원하지 않는 것 같습니다.
gcc 크로스 컴파일러 -v 옵션 출력 결과를 올려 주시면 좀 더 자세한 답변이 달릴지도 모르겠습니다.
Just do it!
답변 감사드립니다.
답변 감사드립니다!
우선 아래에, 컴파일러 옵션을 복사하였습니다. 그리고, 컴파일 시에 -msoft-float 를 추가하여 사용하고 있습니다.
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=c:/codesourcery/g_lite/bin/../libexec/gcc/arm-none-eabi/4.5.
2/lto-wrapper.exe
Target: arm-none-eabi
Configured with: /scratch/janisjo/arm-eabi-lite/src/gcc-4.5-2011.03/configure --
build=i686-pc-linux-gnu --host=i686-mingw32 --target=arm-none-eabi --enable-thre
ads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra
-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fve
rbose-asm} -D__CS_SOURCERYGXX_MAJ__=2011 -D__CS_SOURCERYGXX_MIN__=3 -D__CS_SOURC
ERYGXX_REV__=42 %{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:
%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enab
le-languages=c,c++ --disable-shared --enable-lto --with-newlib --with-pkgversion
='Sourcery G++ Lite 2011.03-42' --with-bugurl=https://support.codesourcery.com/G
NUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-
sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/janisjo/ar
m-eabi-lite/install/host-i686-mingw32/arm-none-eabi --with-libiconv-prefix=/scra
tch/janisjo/arm-eabi-lite/obj/host-libs-2011.03-42-arm-none-eabi-i686-mingw32/us
r --with-gmp=/scratch/janisjo/arm-eabi-lite/obj/host-libs-2011.03-42-arm-none-ea
bi-i686-mingw32/usr --with-mpfr=/scratch/janisjo/arm-eabi-lite/obj/host-libs-201
1.03-42-arm-none-eabi-i686-mingw32/usr --with-mpc=/scratch/janisjo/arm-eabi-lite
/obj/host-libs-2011.03-42-arm-none-eabi-i686-mingw32/usr --with-ppl=/scratch/jan
isjo/arm-eabi-lite/obj/host-libs-2011.03-42-arm-none-eabi-i686-mingw32/usr --wit
h-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-clo
og=/scratch/janisjo/arm-eabi-lite/obj/host-libs-2011.03-42-arm-none-eabi-i686-mi
ngw32/usr --with-libelf=/scratch/janisjo/arm-eabi-lite/obj/host-libs-2011.03-42-
arm-none-eabi-i686-mingw32/usr --disable-libgomp --enable-poison-system-director
ies --with-build-time-tools=/scratch/janisjo/arm-eabi-lite/obj/tools-i686-pc-lin
ux-gnu-2011.03-42-arm-none-eabi-i686-mingw32/arm-none-eabi/bin --with-build-time
-tools=/scratch/janisjo/arm-eabi-lite/obj/tools-i686-pc-linux-gnu-2011.03-42-arm
-none-eabi-i686-mingw32/arm-none-eabi/bin
Thread model: single
gcc version 4.5.2 (Sourcery G++ Lite 2011.03-42)
댓글 달기