STM32F407 HardFault bei float Zuweisung

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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.