我使用带有模拟EEPROM的STM32F0 MCU。EEPROM 将数据作为EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
并作为EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
返回,但我的数据int16_t
。所以我的问题是,我如何写和读签名短?
不幸的是,当涉及到硬件相关的编程(如EEPROM仿真(时,C语言是愚蠢的。因此,您可以使用的唯一可靠解决方案是:
uint16_t u16;
EE_ReadVariable(VirtAddress, &u16);
int16_t i16;
i16 = (int16_t)u16;
或者:
memcpy(&i16, &u16, 2);
其他任何事情都是不安全和危险的。特别是,您不能这样做:
EE_ReadVariable(VirtAddress, (uint16_t*)&i16); // BAD
你也不能i16 = *(int16_t*)&u16; // BAD
.
有关原因的更多信息,可在此处找到:什么是严格的别名规则?
根据应用说明 数据以 16 位字的形式存储在内存中,因此uint16_t
.这是您在模拟EEPROM中的存储必须具有的基础数据类型。无论您存储什么,它都必须具有此类型。
int16_t
保证具有与uint16_t
相同的大小。使用类型 uint16_t 的中间变量。