Forum: Mikrocontroller und Digitale Elektronik Merkwürdige STM32F405-FPU-Exception


von Platon (Gast)


Lesenswert?

Hallo allerseits,

beim Ausprobieren der FPU auf dem STM32F405VG ist mir aufgefallen, dass 
z.B. eine Division durch 0 (mit VDIV) nicht etwa das Flag DZC in FPSCR 
setzt, sondern IOC (invalid operation). Natürlich kann man eine Division 
durch 0 als ungültige Operation bezeichnen, aber wenn es schon ein Flag 
für diesen speziellen Fall gibt, hätte ich erwartet, dass es auch 
gesetzt wird.
Gibt's dafür irgendwo noch einen Schalter (analog zu DIVBYZERO in UFSR)?

Gruss
Platon

von ... (Gast)


Lesenswert?

Hast du die FPU eingeschaltet?

von Platon (Gast)


Lesenswert?

Ja, die läuft. Ich kann meine ganzen Berechnungen problemlos 
durchführen. Wenn ich aber testhalber eine Division durch 0 provoziere, 
kriege ich die unerwartete Exception.

Ein anderes Phänomen, das mir schon beim STM32F2xx aufgefallen war, ist, 
dass ISRs erst etliche Zyklen nach dem Satzen des zugehörigen 
Pending-Flags angesprungen werden. Aber wie gesagt, das scheint nichts 
mit der FPU zu tun zu haben.

von ... (Gast)


Lesenswert?

Vermutlich hast du dann die exception nicht aktiviert:
1
  // enable additional exceptions
2
  SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk | SCB_SHCSR_BUSFAULTENA_Msk | SCB_SHCSR_MEMFAULTENA_Msk;
3
4
  // enable exception on division by zero and unaligned data
5
  SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk | SCB_CCR_UNALIGN_TRP_Msk;

von Platon (Gast)


Lesenswert?

Doch, doch, die sind eingeschaltet und funktionieren so weit auch. 
DIVBYZERO kommt bei Integer-Arithmetik zuverlässig. Ich vermisse das 
DZC-Flag bei Divisionen durch 0 von (single precision) floats.

von Sascha (Gast)


Lesenswert?

Hallo,
die Flags der CPU sind nicht die Flags der FPU?
Mit folgendem Befehl können die Flags z.B. für
die Compare Operationen eingelesen werden.
vmrs   apsr_nzcv,fpscr

Ist FPU lazy Stacking aktiviert?
Sind die Modies im FPU Register FPDSCR richtig definiert?

Habe mit der FPU bei Exeptions und auch bei anderen Exeptions,
nichts feststellen können dass sie vezögert ausgeführt werden.
Vieleicht ist der Interrupt Kontroller nicht richtig initialisiert.
Sehr seltsam?!?


Gruß Sascha

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.