Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M4 FPU - Getting started


von Walter T. (nicolas)


Lesenswert?

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.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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 :)

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

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
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

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.

von Stefan K. (stefan64)


Lesenswert?

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

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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
von Walter T. (nicolas)


Lesenswert?

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
Noch kein Account? Hier anmelden.