[英]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.