簡體   English   中英

將浮點值存儲在uint32_t指針中

[英]Store float value in uint32_t pointer

我想將一些浮點數據存儲在我的TI MSP430微控制器的FRAM寄存器中,並遇到一些問題。

我不知道該怎么做。

使用普通的整數變量,這沒有問題。

普通整數變量:

void main()
{
    uint32_t value = 25;
    uint32_t framPtr = 0xD000;

    FRAMC_write_uint32_t(value, (uint32_t*)framPtr);
}

void FRAMC_write_uint32_t(uint32_t value,
                          uint32_t *framPtr)
{
    *framPtr = value;
}

但是使用浮點值將無法正常工作。 我試圖將函數內部的值更改為float,但是沒有結果。

這是我的浮動數據:

    float value = 1.25;
    uint32_t framPtr = 0xD000;

使用此功能不起作用:

void FRAM_write_float(float value,
                      uint32_t *framPtr)
{
    *framPtr++ = (float)value;
}

它將數據1.40129846e-45(DEN)(HEX:0x00000001)保存在我的內存中。

我希望有人可以幫助我解決我的問題。 謝謝!

如果您知道sizeof(float) == sizeof(uint32_t) 1 ,則重新解釋位的最簡單方法是使用memcpy

float f = /* some_val */;
uint32_t fbits = 0;
memcpy(&fbits, &f, sizeof fbits);

應該足夠安全,因為無符號整數通常沒有陷阱值。

如果您的編譯器支持C99及更高版本。 您也可以通過聯合輸入鍵入修剪。

union {
  float    from;
  uint32_t to;
} pun = { .from = /*some val*/ };

// use pun.to

上面的內容實際上並沒有復制任何內容,因此在緊密循環中可能會稍微快一些。 (正如Olaf指出的那樣,這是現代C語言標准兼容方式)。


1 :如果您的編譯器支持它,則可能_Static_assert在它上面_Static_assert

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM