Forum: Mikrocontroller und Digitale Elektronik STM32F407 HardFault bei float Zuweisung


von Andre (Gast)


Lesenswert?

Moin,

die folgende Zuweisung verursacht stets einen Hardfault. Es ist ein
STM32F407VGT6.

int16_t s16Temp = 0;
fResult = (float)s16Temp;


Mit einer Konstanten funktoniert es:

int16_t s16Temp = 0;
fResult = 12.34;


In den Projekteinstellungen ist -mfloat-abi=hard gesetzt.

Was kann das sein?

Danke für eure Tips!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ist die FPU auch aktiviert?

Dazu brauchts noch etwas Code zum Start:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/BEHBJHIG.html

von Andre (Gast)


Lesenswert?

Ja, das wars. Danke.

von Benjamin S. (recycler)


Lesenswert?

Sowas kann z.B dann passieren, wenn die 16bit Variable auf einem 
Vielfachen von 2 im Speicher liegt. Bei der ARM CPU muss aber die 
Variable vom Type "float" auf 4 aligned sein (vgl. Alignment). Intel 
CPUs können sowas machen, auch wenn sie langsamer bei falschem Alignment 
werden, bzw. der Compiler kann sowas alignen. Beim ST32M hatte ich 
öfters das Problem. Eine mögliche Lösung wäre:
1
union int2float
2
{
3
        int16_t i16[2];
4
        float   f32;
5
} i2f;
6
7
i2f.int16_t[0] = 0;   // erste zwei Bytes
8
i2f.int16_t[0] = 123; // zweite zwei Bytes (dein Wert)
9
10
printf("%f\r\n", i2f.f32);

Was compilerabhängig auch möglich wäre (z.B. GCC)
1
int16_t s16Temp __attribute__ ((aligned (4))) = 0;

von Hermann K. (r2d2)


Lesenswert?

Benjamin S. schrieb:
> Sowas kann z.B dann passieren, wenn die 16bit Variable auf einem
> Vielfachen von 2 im Speicher liegt.

Das ist hier total egal. Der Compiler macht ja eh einen Cast von int auf 
float. Was du beschreibst passiert nur wenn man mit Pointern hantiert.
1
uint16_t x;
2
float *y = &x;
Wird zu Problemen führen. Aber das ist meines Wissens nach auch 
undefined behaviour.

Dagegen macht
1
uint16_t x;
2
float y = x;
keine Probleme.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Andre schrieb:
> Ja, das wars.

Klassiker ;)

Ansonsten möchte ich dir noch meine Faulthandler empfehlen falls dir 
noch andere Faults um die Ohren fliegen.
Da siehste dann gleich mehr:
Beitrag "ARM Cortex-M3/4/7 Faulthandler"

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.