Cortex M4 FPU aktivieren

Gast #3250252
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.
Gast #3250270
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.
Gast #3250319
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.