Forum: Mikrocontroller und Digitale Elektronik Cortex-M3: sqrt() liefert stets unverändertes Argument zurück


von Manuel W. (multisync)


Angehängte Dateien:

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!

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

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.

von Manuel W. (multisync)


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.

von Jim M. (turboj)


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...

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.