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!
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.