float연산 및 수학함수

wsnack의 이미지

현재 제가 가지고 있는 보드에 지금은 리눅스를 올리는 작업중입니다.
리눅스는 완전초보라서 많은 고생을 하고 있는 중입니다.

리눅스 커널은 다 올렸는데
어플을 코딩하면서 테스트를 하는데 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

antaran의 이미지

저도 임베디드쪽은 해보지도 않았거니와 잘 몰라서... -_-;;

그냥 궁금해서인데요, 도대체 머쉰에서 뭐가 illegal instruction이라고 하는지 파악하는게

근본 해결책인 것 같습니다.

sqrt((double)h1 * h1 + h2 * h2); 이렇게만 하면 illegal instruction이라고 안투덜 거리는지요?

뭔가 실수값을 할당할 때의 문제인건지 계산할 때의 문제인건지(계산은 아닌 것 같은데...)

일단 생각나는 것은 이정도네요. 행운을 빕니다. 이만...

grassman의 이미지

gcc 툴체인이 soft-float를 지원하지 않는 상태에서 커널에서 NWFPE 옵션을 주지 않은 것 같습니다. 커널 옵션에서 NWFPE를 활성화 해주면 될 겁니다.

bushi의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.