Forum: Mikrocontroller und Digitale Elektronik SAM V71 Floating Point


von Günther (Gast)


Lesenswert?

Hallo Leute!

Zu Testzwecken möchte ich meinen Atmel SAM V71 (ein Cortex-M7 mit FPU) 
eine Matrix mit "zufälligen" Floating-Point werten füllenlassen:
1
float32_t rnd_matrix[9];
2
  
3
for (uint16_t i = 0; i < 9; i++) {
4
  rnd_matrix[i] = (float32_t) rand();
5
}

Soweit funktioniert das auch alles. Möchte ich die Werte jedoch vorher 
skalieren, dann lande ich immer im Dummy Handler, d.h. es ist irgendeine 
Exception aufgetreten.
1
const float32_t scale = 10.5;
2
float32_t rnd_matrix[9];
3
  
4
for (uint16_t i = 0; i < 9; i++) {
5
  rnd_matrix[i] = (float32_t) rand() / scale;
6
}

Wobei ein üblicher Verdächtiger - die Division durch Null - hier 
natürlich ausgeschlossen werden kann.

Mein Ziel ist es eigentlich, kleine Float-Werte zwischen 0.0 und 1.0 mit 
der rand-Funtkionen zu bekommen und diese anschließend zu skalieren, 
damit sie zwischen 0.0 und 1.0 * scale liegen. Bspw. soll das dann so 
aussehen:
1
float scale = 10.0;
2
float random_f = (float)rand()/(float)(RAND_MAX/scale);

Leider ist das mein erster Ausflug in die Fließkomma-Welt, zuvor habe 
ich immer auf float oder double verzichtet und Integer genutzt. Deswegen 
kann ich mir den Fehler auch gerade nicht erkären ;)

Für einen Hinweis wäre ich sehr dankbar :)

von Günther (Gast)


Lesenswert?

Kleine Ergänzung:

Es tritt obigem Code immer ein HardFault an der Stelle
1
rnd_matrix[i] = (float32_t) rand() / scale;

auf.

von Dennis R. (dennis_r93)


Lesenswert?

Ich sehe auf dem ersten Blick auch keinen Grund warum der Code nicht 
funktionieren sollte.

Hast du in dem Dummy Handler mal nachgeschaut wie die Statusflags 
aussehen?
Ich habe es gerade nicht im Kopf, aber ich meine es gibt Statusflags, 
was genau passiert ist.
Wirft er die Exception bei der ersten Berechnung oder erst später?
Kannst du im Debuger im Singlestepmodus durchgehen und herausfinden bei 
welchem Befehl er die Exception wirft?

Es gibt auch Asynchrone Exceptions die erst viele Befehle später 
auftreten, Wenn du z.B. mit einem Store einen illegalen Zugriff machst 
wird die Exception nicht bei dem Store Befehl geworfen sondern erst 
später.
Deshalb wäre es interessant welche Exception geworfen wird.

von Dennis R. (dennis_r93)


Lesenswert?

schau mal nach in
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0646a/CIHFDJCA.html
Dort gibt es eine ganze Reihe Register die dir sagen können was schief 
gegangen ist.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Meine Erfahrung mit den älteren SAMs (Cortex-M3/4): schalte mal alle
potenziellen Trap-Quellen explizit frei und installiere Handler
dafür, auf die du dann Breakpoints setzen kannst.

Das erspart dir den blöden "promotet hardfault", da es dir schneller
eine Indikation gibt, was wirklich schief gelaufen ist.

Prinzipiell kann man sich aucher auch beim promoted hardfault durch
die Registerbits hangeln um zu finden, was die konkrete Ursache war.

von Günther (Gast)


Lesenswert?

So, eine kleine Rückmeldung:

Das Hard Fault Status Register (HFSR) hat das FORCED Bit gesetzt. Im 
Configurable Fault Status Register (CFSR) ist das Bit NOCP gesetzt. Die 
Beschreibung für dieses Bit lautet:

"The processor has attempted to access a coprocessor.

The processor does not support coprocessor instructions."

von klausr (Gast)


Lesenswert?

Günther schrieb:
> The processor does not support coprocessor instructions."

Im Startup-Code FPU nicht aktiviert?

von Günther (Gast)


Lesenswert?

Also ich habe in der main an erster Stelle einen Aufruf von
1
fpu_enable();
stehen. fpu_enable() ist wie folgt implementiert:
1
__always_inline static void fpu_enable(void)
2
{
3
  irqflags_t flags;
4
  flags = cpu_irq_save();
5
  REG_CPACR |=  (0xFu << 20);
6
  __DSB();
7
  __ISB();
8
  cpu_irq_restore(flags);
9
}

Muss die Aktivierung der FPU im Startup-Code erfolgen? Wenn ja, warum 
und woher bekomme ich diese Info?

von klausr (Gast)


Lesenswert?

Günther schrieb:
> Muss die Aktivierung der FPU im Startup-Code erfolgen?

Nein, soweit ich weiß! Die FPU muss halt vor der Benutzung aktiviert 
werden.
Dein Startup Code sieht o.k. aus (nach 
http://www.atmel.com/Images/Atmel-44047-Cortex-M7-Microcontroller-Optimize-Usage-SAM-V71-V70-E70-S70-Architecture_Application-note.pdf 
S. 12). Da die SAM V71 noch relativ neu sind, könnte es auch ein Problem 
mit dem Compiler sein. Evtl. mal ein mini Programm schreiben, welches 
die FPU nutzt. Wenn das dann auch abstürzt, evtl. beim Support des 
Compiler-Herstellers nachfragen und genau alle Optionen angeben, die du 
beim Compilieren verwendet hast.

Anmerkung: Ich selbst habe keinen M7 geschweige denn einen SAM V71 hier.

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.