Hier ist vereinfachter Code:
Code: Select all
#include
#include
int main() {
float setVal = 50000.0f;
uint32_t * val1 = (uint32_t *)((void *) (& setVal));
printf("Float into vSV: %x\r\n", * val1);
}
Der Code ist im Grunde so konzipiert, dass er eine Variable auf einen Wert setzt (
Code: Select all
50000.0fDas gedruckte Ergebnis ist 40E86A00. Was ich jedoch erwarten würde, wäre 47435000. Ich gehe davon aus, dass dieser Wert auf der Verwendung von https://gregstoll.com/~gregstoll/floattohex/ basiert, um 50000,0 in einen Hexadezimalwert umzuwandeln.
Ich habe auch einen Bibliothekscode, der den Float über den UART sendet. Die auf dem UART übertragenen Daten sind ebenfalls 40E86A00 (jedoch mit vertauschter Bytereihenfolge aufgrund von Endianness).
Wenn ich diesen Code auf einem Intel-basierten Linux-PC ausführe, ist das Ergebnis 47435000, was meinen Erwartungen entspricht.
Was fehlt mir?
Ergänzungen zur ursprünglichen Frage
Using uint32_t val1; memcpy(&val1, &setVal, 4); printf("%x\n", val1); von @SteveSummit erhalte ich die erwarteten 47435000. Dies erklärt jedoch nicht die Bibliotheksfunktion, die den Wert erzeugt, der effektiv Daten an den UART sendet.
Hier ist ein Beispiel für den Beginn eines der Aufrufe an den Compiler: arm-none-eabi-gcc -c -mcpu=cortex-m7 -mthumb -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -Wall -Wextra -Wundef -Wstrict-prototypes -Wa,-alms=./build/lst/crt1.lst -DCORTEX_USE_FPU=FALSE -DSTM32_ENFORCE_H7_REV_XY -MD -MP -MF
Hier sind die Versionsnummerninformationen zu den Compilern: arm-none-eabi-gcc (Arm GNU Toolchain 11.3.Rel1) 11.3.1 20220712 und arm-none-eabi-g++ (Arm GNU Toolchain 11.3.Rel1) 11.3.1 20220712
Mobile version