Forum: Mikrocontroller und Digitale Elektronik Cortex M4 FPU aktivieren


von ... (Gast)


Lesenswert?

Ich benutze das Cortex M4 discovery Board mit einem STM32F407 und habe 
darauf FreeRTOS laufen. Ich habe mir eine ARM Toolchain mit Hardware 
floating point compiliert. Leider gibt es mit der FPU ein Problem, wo 
ich nicht weiter komme.

Laut Manual sollte die FPU so aktiviert werden:
1
SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2));

Das habe ich gemacht, aber wenn ich eine Berechnung mache und mir das 
Ergebnis ausgeben lasse:
1
snprintf(s, sizeof(s), "2*pi=%f#\n", f * 2);

Dann kommt ein komplett falsches Ergebnis raus:
1
2*pi=42769810903078258177028436187903032521109603624808797982656144311201298320619936835174

Wenn ich die gleiche Berechnung in einem Task von FreeRTOS mache, ist 
alles ok! Aber nur in dem Task. Wenn ich kurz vorm Starten des 
Schedulers, nachdem FreeRTOS nochmal die FPU aktiviert hat, die 
Berechnung mache, kommt auch wieder das falsche Ergebnis raus. Wisst ihr 
woran das liegt?

Ich hab mir jetzt so beholfen, das ich als erstes einen Init-Task 
starte. Aber ich würde gern verstehen, wo das Problem ist.

von Dr. Sommer (Gast)


Lesenswert?

Standardmäßig werden die FPU-Register nicht automatisch beim Eintritt 
einer Exception gesichert, d.h. wenn während der Berechnung eine ISR 
ausgeführt wird und diese ebenfalls die FPU verwendet geht dein Ergebnis 
kaputt. Du musst entweder das automatische Pushen der Register 
aktivieren, die Interrupts (kurzzeitig) abschalten, oder die 
entsprechende Funktionalität des RTOS verwenden.

Das aktivieren der FPU hast du ja scheinbar schon geschafft, hier 
STM32: FPU von den STM32 mit Cortex-M4F nutzen steht nochmal wie das 
geht.

von ... (Gast)


Lesenswert?

Ich hab sowas in der Art vermutet. Allerdings läuft zu dem Zeitpunkt, wo 
ich die Testausgabe mache, kein Interrupt. Zumindest habe ich keinen 
gestartet. Vielleicht macht die newlib etwas, das den Inhalt der FPU 
Register zerstört.

von Dr. Sommer (Gast)


Lesenswert?

Da hilft mal wieder wohl nur Disassembly angucken, und jede 
Maschinen-Instruktion einzeln im Debugger durchsteppen.

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.