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

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.