Hallo Leute. Ich will einen float Wert zu einem anderen µC übertragen.
Ich hatte vor den float auf meinem stm32 byteweise auf den anderen
controller zu schieben. Soweit kein Problem. Das problem ist, der
empfangende Controller ist kein STm32/ kein ARM!!. Somit muss ich wissen
nach welchem schema der Compiler den Float abspeichert. Weiß jemand was?
Ps: Wie ein Double gespeichert wird würde mich auch interessieren :)
>Somit muss ich wissen>nach welchem schema der Compiler den Float abspeichert.
Nimm deinen Debugger, speichere 1.2345f irgendwo als
volatile float ab und vergleiche den Inhalt im Speicher.
A. K. schrieb:> Da der keine FPU hat hängt das vom Compiler ab.
Der Stm32f4 hat eine FPU!
A. K. schrieb:> ARM hat IEEE754 Format, STM32 little endian.
Der STM32 ist ein ARM??!?!?!?!?!
holger schrieb:> Der dsPic aber nicht. Also nochmal meinen Post oben> lesen, dann weisst du ganz genau ob die beiden zusammenpassen.
Ok. Dann lese ich mich mal in IEEE754 ein.
Den dsPIC hab ich schon :) bzw. Weiß wo ich die Info herbekomm
Danke
>Der Stm32f4 hat eine FPU!
Double kann die übrigends nicht. Das wird in Software gemacht.
Jetzt frage ich mich nur noch weshalb man ein float
von einem Zahlenmonster zum anderen verschicken will.
holger schrieb:> Double kann die übrigends nicht. Das wird in Software gemacht.
Spielt in dieser Frage keine Rolle, da das Format von ARM im ABI
festgelegt sein dürfte, unabhängig davon, wie es implementiert wird. Nur
die Byteorder ist dann vom exakten ARM abhängig.
M. H. schrieb:> Den dsPIC hab ich schon :) bzw. Weiß wo ich die Info herbekomm
Doku vom Compiler vermutlich. Evtl. ABI Doku, falls es die vom Microchip
separat gibt. Von ARM gibt es die.
A. K. schrieb:> M. H. schrieb:>> Der STM32 ist ein ARM??!?!?!?!?!>> Die STM32 haben Cortex-M Cores, und die sind von ARM.
Das weiß ich auch.. Ich glaube wenn man das nicht wüsste siehts schlecht
aus mitm Programmieren :)
Ich hab nur den Kontext der Aussage verramscht. Mein Satz war eine
Feststellung, mit verwirrtem Hintergrund
M. H. schrieb:> Somit muss ich wissen> nach welchem schema der Compiler den Float abspeichert. Weiß jemand was?
Guck's dir einfach an. Leg dir ein float Variable in den Speicher, setzt
sie auf 1.0 und dann guck dir an, was im Speicher passiert, wenn du sie
in einer Schleife immer weiter durch 2 teilst bzw. mit 2 multiplizierst.
Damit siehst du schnell wie der Exponent incl. Vorzeichen liegt. Und
dann ist der Rest einfach die Mantisse. Wegen der Normalisierung ist das
erste Bit langweiig und wird meist weg gelassen.
Die einzig wirklich robuste und portable Option wäre es wohl die float
bzw. double Zahl in einen String (oder ein anderes "standardisiertes"
Format) zu bringen, und anschließend dieses zu übertragen. Das ist zwar
mit Overhead verbunden (printf, scanf, usw.), dafür aber unabhängig von
der verwendeten Hardware und verschiedenen Software Implementierungen.
Wie kommunizieren die beiden Mikrocontroller denn eigentlich? UART? SPI?
I2C?
Mit freundlichen Grüßen,
Karol Babioch
Wie man sieht zählt die Mantisse in jedem Schritt brav um 1 LSB hoch.
Hinzu kommt dann noch Behandlung von NaN, Inf, Denormals, +/-0, etc.
Wem die Schleife zu unbequem ist oder keine String-Darstellung braucht
kann auch einfach