Forum: Mikrocontroller und Digitale Elektronik [STM32F4] Newlib/GCC mit FPU-Unterstützung


von Christian G. (christian_g83)


Lesenswert?

Hallo, zusammen!

Hat jemand schon einmal eine Newlib/GCC-Kombination gebaut (mit Windows 
als Host), die die FPU des STM32F4 unterstützt? Bei CodeSourcery gibt es 
die Newlib ja nur als Soft-Float-Version.

Christian

von ReinerL (Gast)


Lesenswert?

Gebaut nicht, aber es gibt was fertiges:

https://launchpad.net/gcc-arm-embedded/

man sollte allerdings das Linkerscript anpassen wie hier:

Beitrag "STM32 + ARM-GCC: Linker produziert falsche Adressen"

von THaala (Gast)


Lesenswert?

Guckst du hier:

http://forum.chibios.org/phpbb/viewtopic.php?f=2&t=337

und hier:

Beitrag "Verdacht auf GCC / Library Fehler ARM - Toolchain"

die lib hat damit gar nichts zu tun.Es gibt keine spezial - lib zur 
Unterstützung der FPU...
Gruß Thilo

von Christian G. (christian_g83)


Lesenswert?

THaala schrieb:

> Es gibt keine spezial - lib zur Unterstützung der FPU...

Man muss den mathematischen Teil der Newlib (sin, cos, usw.) mit 
FPU-Code bauen. Das geschieht bei Multilib-Builds während des Baus der 
gesamten Toolchain. Und da die Multilib-Vektoren (wenn ich das richtig 
sehe) hart in den GCC einkompiliert werden, kann man die Newlib 
nachträglich nur unter erschwerten Bedingungen kompilieren.

Korrigiert mich, wenn ich hier falsch liege.

Christian

von Christian G. (christian_g83)


Lesenswert?

ReinerL schrieb:

> https://launchpad.net/gcc-arm-embedded/

Oh. Das kannte ich noch nicht. Danke für den Tipp!

Christian

von THaala (Gast)


Lesenswert?

> Man muss den mathematischen Teil der Newlib (sin, cos, usw.) mit
> FPU-Code bauen. Das geschieht bei Multilib-Builds während des Baus der
> gesamten Toolchain. Und da die Multilib-Vektoren (wenn ich das richtig
> sehe) hart in den GCC einkompiliert werden, kann man die Newlib
> nachträglich nur unter erschwerten Bedingungen kompilieren.

> Korrigiert mich, wenn ich hier falsch liege.

Ja  - da korrigiere ich Dich. Wenn Du die den Thread bei Microcontroller 
mal ansiehst wirst du entdecken, das alle Funktionen, die du genannt 
hast über die FPU gehen. (Achtung ist nur eine 32 Bit FPU - also nur 
floats keine doubles...)

Sobald Funktionen ins Spiel kommen, die nicht per FPU machbar sind wird 
auf die lib gewechselt. Z.B. beim Rechnen mit double statt mit floats.

Ist also eine reine Compiler - Einstellung!

Gruß Thilo

von ReinerL (Gast)


Lesenswert?

THaala schrieb:
> die lib hat damit gar nichts zu tun.Es gibt keine spezial - lib zur
> Unterstützung der FPU...

Die Aussage stimmt nur bedingt. Die HW-FPU kann ich auch mit Sourcery 
für float benutzen, verwende ich Funktionen aus der Lib, dann muss diese 
aber auch zur FPU passen.

Gruß
Reiner

von THaala (Gast)


Lesenswert?

Hallo Reiner,

hast du da mal ein Beispiel ?

Ich konnte während der Untersuchung bzgl. der FPU - Compiler - 
Einstellungen nichts derartiges finden. Ich Frage mich ja auch wieso 
denn da die lib zur FPU passen muss ? Ist die FPU passend, generiert der 
Compiler FPU - Code. Ist die FPU nicht passend wird die Lib aufgerufen. 
Natürlich mit entsprechnder Syntax, aber die muss ja sowieso stimmen, 
auch wenn keine FPU da wäre....

Gruß thilo

von Christian G. (christian_g83)


Lesenswert?

THaala schrieb:

> Wenn Du die den Thread bei Microcontroller
> mal ansiehst wirst du entdecken, das alle Funktionen, die du genannt
> hast über die FPU gehen.

Die Berechnung trigonometrischer Funktionen läuft direkt auf der 
Hardware?

Christian

von Christian G. (christian_g83)


Lesenswert?

ReinerL schrieb:

> Die HW-FPU kann ich auch mit Sourcery
> für float benutzen, verwende ich Funktionen aus der Lib, dann muss diese
> aber auch zur FPU passen.

Genau darum geht es mir. Der Compiler kann (mit der entsprechenden 
Option) Code für die FPU generieren. Sobald ich aber Funktionen aus der 
Newlib verwenden möchte (die ja vorkompiliert vorliegt), beschwert sich 
der Linker, da unterschiedliche Float-ABIs verwendet werden.

Ursächlich dafür ist die Multilib-Konfiguration, die beim 
Standard-Codesourcery-Build leider keine FPU-Versionen umfasst. Versucht 
man nun, Object-Dateien, die mit FPU-Unterstützung kompiliert wurden, 
mit einer Newlib-Variante, die ohne FPU-Unterstützung kompiliert wurde, 
zusammenzulinken, wird feststellen, dass das nicht funktioniert.

Christian

von ReinerL (Gast)


Lesenswert?

Christian Gudrian schrieb:
> Ursächlich dafür ist die Multilib-Konfiguration, die beim
> Standard-Codesourcery-Build leider keine FPU-Versionen umfasst. Versucht
> man nun, Object-Dateien, die mit FPU-Unterstützung kompiliert wurden,
> mit einer Newlib-Variante, die ohne FPU-Unterstützung kompiliert wurde,
> zusammenzulinken, wird feststellen, dass das nicht funktioniert.

Das ist auch genauso meine Erfahrung, bei meiner Suche bin ich dann auf 
die Toolchain von Launchpad gestoßen, da hat sich der Linker auch nicht 
mehr beschwert.
Hat zumindest bei sqr() funktioniert, nur der blöde Fehler mit dem 
Linkerscript hat mich einiges an Zeit gekostet.

Gruß
Reiner

von Christian G. (christian_g83)


Lesenswert?

ReinerL schrieb:

> bei meiner Suche bin ich dann auf
> die Toolchain von Launchpad gestoßen

Die oben bereits erwähnte Seite (https://launchpad.net/gcc-arm-embedded) 
ist genau das, was ich gesucht habe: komplette Toolchain mit expliziter 
Unterstützung für Cortex-M4-CPUs mit und ohne FP-Unterstützung (sowohl 
soft als auch hard).

Christian

von THaala (Gast)


Lesenswert?

Ein letztes Mal versuche ich es noch:

Es gibt keine Lib, die etwas mit der FPU zu tun hat. Du findest keine 
Toolchain, die für eine FPU eine Unterstützng bietet. Es finden keine 
Aufrufe in eine float - ABI statt, es sei denn du verwendest "double" - 
Argumente. Ich schätze, du hast ein anderes Problem.

Damit das richtig klappt muss man dem Compiler aber auch die richtigen 
Switches mitgeben:

 -falign-functions=16
 -mfloat-abi=softfp
 -mfpu=fpv4-sp-d16
 -fsingle-precision-constant

Hast du überhaupt in die Threads reingeschaut ?

gruß Thilo

von ReinerL (Gast)


Lesenswert?

THaala schrieb:
> Es gibt keine Lib, die etwas mit der FPU zu tun hat.

Ich glaube wir reden aneinander vorbei. In dem Thread habe ich nicht 
gesehen dass Du eine mathematische Funktion aus der Lib aufgerufen hast.
Es geht z.B. darum mathematische Funktionen aus der Lib zu verwenden, 
und bei diesen die FPU Ünterstützung zu haben.
Das wird mit "-mfloat-abi=softfp" nicht funktionieren, bzw. es wird die 
soft-float Lib verwendet.

Gruß
Reiner

von Christian G. (christian_g83)


Lesenswert?

THaala schrieb:

> Es gibt keine Lib, die etwas mit der FPU zu tun hat.

Ich glaube, wir reden aneinander vorbei. Nach meiner Definition hat die 
libm beispielsweise etwas mit der FPU zu tun. Denn die ist voll von 
Gleitkommaoperationen.

> Ich schätze, du hast ein anderes Problem.

Mag sein. Schätze mal los. Vielleicht verstehen wir uns dann besser. :)

> Hast du überhaupt in die Threads reingeschaut?

Das habe ich. Leider befassen die sich nicht mit meiner Frage, die 
mittlerweile auch zufrieden stellend beantwortet wurde. Die oben 
verlinkte Toolchain baut nämlich die Newlib in folgenden 
Konfigurationen:
1
.;
2
thumb;@mthumb
3
fpu;@mfloat-abi=hard
4
armv6-m;@mthumb@march=armv6s-m
5
armv7-m;@mthumb@march=armv7-m
6
armv7e-m;@mthumb@march=armv7e-m
7
armv7-r/thumb;@mthumb@march=armv7-r
8
armv7-r/thumb/fpu;@mthumb@mfloat-abi=hard@march=armv7-r@mfpu=vfpv3-d16
9
armv7e-m/fpu;@mthumb@mfloat-abi=hard@march=armv7e-m@mfpu=fpv4-sp-d16
10
armv7-r/thumb/softfp;@mthumb@mfloat-abi=softfp@march=armv7-r@mfpu=vfpv3-d16
11
armv7e-m/softfp;@mthumb@mfloat-abi=softfp@march=armv7e-m@mfpu=fpv4-sp-d16
Es sind genau die */fpu-Konfigurationen, die bei CodeSourcery fehlen. 
Und die habe ich gesucht. Und jetzt gefunden.

Mehr wollte ich nicht.

Christian

von THaala (Gast)


Lesenswert?

>> Ich glaube, wir reden aneinander vorbei. Nach meiner Definition hat die
>> libm beispielsweise etwas mit der FPU zu tun. Denn die ist voll von
>> Gleitkommaoperationen.

Hast Recht - Entschuldige!

Gruß T.

von Christian G. (christian_g83)


Lesenswert?

THaala schrieb:

> Hast Recht - Entschuldige!

Kein Problem. Aber der von dir verlinkte Thread ist auch interessant. 
Den muss ich mir allerdings mal in Ruhe zu Gemüte führen.

Christian

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.