Hallo zusammen, ich will auf meinem STM32F446 die FPU nutzen. Um genau zu sein, war das der Sinn, mich überhaupt auf diese MCU zu stürzen. Nun bin ich in der Numerik weiß Gott nicht unbewandert - aber in C und auf µCs komplett unbeleckt. Die Build-Optionen (--cpu=Cortex-M4.fp.sp) habe ich schon gefunden. Jetzt suche ich den Anfang. Das ARM Instruction Manual ist nett. Wie ich die FPU in C sinnvoll nutze, weiß ich dadurch noch nicht. ("OK - es gibt also einen Befehl zur bilinearen Interpolation - toll, aber unerwartet - wie nutze ich das in C?") Erkennt der Compiler automatisch, welche C-Sequenzen die FPU sinnvoll machen kann, oder muß ich spezielle FPU-funktionen nutzen? Wo würde ich Funktionen wie die obengenannte bilineare Interpolation finden? Ich nehme mal an, ich muß peinlich darauf achten, daß nicht irgendwie irgendwo etwas heimlich zu double gecastet wird (die Compilerwarnung habe ich auch schon gefunden). Sprich: Wo kann man sich zu diesem Thema sinnvoll einlesen? Viele Grüße W.T.
Walter T. schrieb: > Das ARM Instruction Manual ist nett. Wie ich > die FPU in C sinnvoll nutze, weiß ich dadurch noch nicht. Compilerschalter diese hier: -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 Und dann ganz normal float im C-Code verwenden, den rest macht der Compiler :)
Man kann auch -S angeben und dann den erzeugten Assemblercode inspizieren was der Compiler daraus genau macht. Oder notfalls mit asm() den Code vorgeben. Das ist aber sehr knifflig.
:
Bearbeitet durch User
Das aktiviert die FPU im Cortex-M4:
1 | #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
2 | SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ |
3 | #else
|
4 | #warning "Compiler generates NO FPU instructions!"
|
5 | #endif
|
Danke! Die FPU aktiviert habe ich. Jetzt fehlt mir aber noch der Zugriff für eine effiziente Nutzung. Die <math.h> aus der Newlib scheint das meiste in double precision zu machen. Damit dauert schon die einfache Berechnung eines Sinus schon eine gefühlte Ewigkeit. Gibt es eine vernünftige 32-Bit-Float-Library, die für diese Plattform geeignet ist? Oder muß man alles selbst implementieren? Keine Sorge- den Teil mit der numerischen Stabilität bei einfacher Genauigkeit bekomme ich in den Griff.
Kennst Du die Cortex DSP library? Da gibt es für fast jeden Bereich optimierte Funktionen: http://www.keil.com/pack/doc/CMSIS/DSP/html/index.html Für die bilineare Interpolation gibt es z.B. für 4 verschiedene Datentypen Routinen: http://www.keil.com/pack/doc/CMSIS/DSP/html/group__BilinearInterpolate.html Viele Grüße, Stefan
Walter T. schrieb: > Die <math.h> aus der Newlib scheint das meiste in double precision zu > machen. Damit dauert schon die einfache Berechnung eines Sinus schon > eine gefühlte Ewigkeit. Dann verwende einfach sinf oder powf oder logf oder oder oder ... Einfach immer ein f anhängen^^ Ahja und konstanten immer ála 1234.0f ... Brav das f anhängen, sonst ist es eine Double-Konstante. Macht nicht immer was aus - insbesondere, wenn man sie sowieso einem float zuweist, aber sollte man sich angewöhnen :)
:
Bearbeitet durch User
Stefan K. schrieb: > Kennst Du die Cortex DSP library? Danke! Das sieht sehr gut aus! Habe auch schon gesehen, daß sie bei STMCubeF4 beiliegen. Jetzt habe ich erst einmal genug zu lesen.
Beitrag #5173401 wurde vom Autor gelöscht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.