Cortex-M3: sqrt() liefert stets unverändertes Argument zurück

OP #4418932
Hallo zusammen,

ich programmiere gerade einen Cortex-M3 und habe das Problem, dass der 
Rückgabewert von sqrt() stets dem des Arguments entspricht. Es wird also 
nicht die Wurzel gezogen, sondern immer die unveränderte Zweierpotenz 
zurückgegeben.

Beispielcode:
1
        volatile double bla = 4;
2
        c = (double)sqrt( (double)bla );

Die Variable c hat nach Ausführung den Wert 4. Selbiges mit allen 
anderen Werten für 'bla', selbst für negative, was mich wundert, da 
sqrt() dann lt. Google eigentlich einen domain error auslösen sollte.

Der Assemblycode sieht folgendermaßen aus:
1
(261)          volatile double bla = 4;
2
2000074E  mov.w  r2, #0
3
20000752  mov.w  r3, #0
4
20000756  movt  r3, #16400  ; 0x4010
5
2000075A  strd  r2, r3, [r7, #48]  ; 0x30
6
(262)          c = (double)sqrt( (double)bla );
7
2000075E  ldrd  r2, r3, [r7, #48]  ; 0x30
8
20000762  mov  r0, r2
9
20000764  mov  r1, r3
10
20000766  bl  0x200019ac <sqrt>
11
2000076A  movw  r3, #11760  ; 0x2df0
12
2000076E  movt  r3, #8192  ; 0x2000
13
20000772  strd  r0, r1, [r3]

Ich habe korrekt "math.h" inkludiert und die IDE Em::Blocks angewiesen 
libm.a einzubinden (siehe Screenshot).

Hat jemand Tipps wie ich das Problem beheben könnte?

Danke!
Angehängte Dateien:
Normalerweise wirft man dem Linker einfach nur ein "-lm" vor, um gegen 
die Mathe-Bibliothek zu linken. Die libm.a findet er selbst.

Ansonsten wäre es nicht verkehrt, mal mit sqrtf() zu schauen, ob 
wenigstens single-precision funktioniert.
OP
S. R. schrieb:
> Normalerweise wirft man dem Linker einfach nur ein "-lm" vor, um gegen
> die Mathe-Bibliothek zu linken. Die libm.a findet er selbst.
>
> Ansonsten wäre es nicht verkehrt, mal mit sqrtf() zu schauen, ob
> wenigstens single-precision funktioniert.

Vielen Dank für den Tipp, das war tatsächlich die Ursache!

Wenn ich "-lm" ins Feld "Other options" (siehe Screenshot im 
Eingangspost) einfüge und die Library nicht manuell einbinde 
funktionierts.
ARM GCC verwendet Multilib und würfelt den korrekten Lib Pfad je nach 
Platform aus - weil Cortex M0, Cortex M3 und Cortex M4F jeweils eigene 
Libs brauchen.

Dein o.g. Pfad zeigt IMO auf die ARM Variante, die auf einem Cortex-M 
gar nicht laufen kann da der nur Thumb2 kennt. Da hätte der Linker 
eigentlich meckern müssen...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.