将浮点值存储在 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 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) 在我的内存库中。
我希望有人能帮助我解决我的问题。
谢谢!
重新解释位的最简单方法是使用 memcpy
,如果您知道 sizeof(float) == sizeof(uint32_t)
1
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
就可以了。
我想在我的 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 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) 在我的内存库中。
我希望有人能帮助我解决我的问题。 谢谢!
重新解释位的最简单方法是使用 memcpy
,如果您知道 sizeof(float) == sizeof(uint32_t)
1
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
就可以了。