float연산 및 수학함수
현재 제가 가지고 있는 보드에 지금은 리눅스를 올리는 작업중입니다.
리눅스는 완전초보라서 많은 고생을 하고 있는 중입니다.
리눅스 커널은 다 올렸는데
어플을 코딩하면서 테스트를 하는데 float연산과 수학함수가 제대로 되지 않고 있습니다.
빌드는 문제 없이 되지만 런타임시에 아래 부분에서 illegal instruction이 발생합니다.
unsigned char red, val;
unsigned char tmp[5];
red = 12;
tmp[0] = (unsigned char)(0.29 * red); ===> Illegal instruction 발생
illegal instruction이 발생하는 부분에서 배열을 사용하지 않고 그냥 일반변수를 사용하면
illegal instruction이 발생하지 않습니다.
예) val = (unsigned char)(0.3 * red); ===> 런타임시에도 illegal instruction이 생기지 않음
위 문제를 해결하기 위해 정말 여러가지 방법을 사용해 봤는데
그래서 소수점을 사용안하기 위해서 아래와 같이 임시 방편으로 했습니다.
tmp[0] = (unsigned char)((29 * red) / 100);
이 방법 말고 다른 방법은 없는건가요???
그리고 또 다른 문제점은 수학함수를 사용하는 겁니다.
물론 여기서도 소수점의 결과를 받는 부분에서 런타임시에 illegal instruction이 생깁니다.
int h1, h2;
double val;
h1 = 5;
h2 = 3;
val = sqrt((double)h1 * h1 + h2 * h2); ===> Illegal instruction 발생
여기서는 전혀 해결 방법을 찾지 못하고 있습니다.
왜 이런 현상이 생기는지 그래고 해결 방법이 무엇인지 알고 싶습니다.
== 컴파일 환경 ==
> Fedora10
> BSP : s3c-linux-2.6.21 (S3C6410)
> Cross Compiler : 4.3.1-eabi-armv6
뭔가 문제는 하나인 것 같은데...
저도 임베디드쪽은 해보지도 않았거니와 잘 몰라서... -_-;;
그냥 궁금해서인데요, 도대체 머쉰에서 뭐가 illegal instruction이라고 하는지 파악하는게
근본 해결책인 것 같습니다.
sqrt((double)h1 * h1 + h2 * h2); 이렇게만 하면 illegal instruction이라고 안투덜 거리는지요?
뭔가 실수값을 할당할 때의 문제인건지 계산할 때의 문제인건지(계산은 아닌 것 같은데...)
일단 생각나는 것은 이정도네요. 행운을 빕니다. 이만...
s3c6410에는 부동 소수점 보조 프로세서가 내장되어 있지 않을 겁니다.
gcc 툴체인이 soft-float를 지원하지 않는 상태에서 커널에서 NWFPE 옵션을 주지 않은 것 같습니다. 커널 옵션에서 NWFPE를 활성화 해주면 될 겁니다.
eabi 툴체인으로
eabi 툴체인으로 보이고, eabi 에선 FPA 가 아니라 VFP 를 사용합니다.
eabi 툴체인으로 컴파일한 바이너리는 커널모드 FPA emulator 가 필요치 않습니다.
커널에 EABI 지원 옵션을 켜지 않았다면... illegal instruction은 둘째치고,
모든 system call 이 실패할테니 커널 옵션문제는 아닌 것 같습니다.
커널에서 EABI 지원 옵션을 켜면 VFP 지원 옵션은 자동으로 켜집니다.
h/w vfp 를 검색해서 찾지못하면 메시지가 출력됩니다.
(arch/arm/vfp/Makefile 에서 comment-out 되어 있는 -DDEBUG 를 살리세요)
+
s3c6410 이... arm1176jzf 인가였고 VFP11(VFPv2)를 포함하고 있던 것으로 기억하는데,
h/w VFP 를 사용하도록 만들어진 툴체인이 있긴있나보네요.
혹시 모르니... 툴체인에 포함된 gcc 를 -dumpspecs 옵션주고 실행시킨 결과도 올려주시면 좋겠는데요.
OTL
댓글 달기