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

OP #4418932
Lesenswert?
• ▲
▼
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:
OP #4419928
Lesenswert?
• ▲
▼
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.
#4420134
Lesenswert?
• ▲
▼
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.