STM32F407 HardFault bei float Zuweisung

Gast #6046295
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!
#6046346
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;
#6046353
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren