我在texas instruments C2000微控制器上有一个非常糟糕的案例,它只能表示uin16_t而不能表示uint8_t。现在我有了一个类似下面的结构体,其中每个uint16_t只代表一个字节的数据,它将被写入外部EEPROM:
typedef struct
{
uint32_t a;
uint32_t b;
uint32_t c;
uint32_t d;
} MCL_Struct_t;
MCL_Struct_t struc_write = {0};
MCL_Struct_t struc_read = {0};
uint16_t *struc_write_handle = ((uint16_t *)&struc_write);
uint16_t *struc_read_handle = ((uint16_t *)&struc_read);
struc_write.a = 0x11112222;
struc_write.b = 0x11113333;
struc_write.c = 0x11114444;
struc_write.d = 0x11115555;
//call eeprom write
EEPROM_writeTransaction(eepromAddr, struc_write_handle, sizeof(MCL_Struct_t));
//read back eeprom
EEPROM_readTransaction(eepromAddr, sizeof(MCL_Struct_t));
//copy to struc_read
memcpy(struc_read_handle, &SPI_DMA_Handle.pSPIRXDMA->pbuffer[0], sizeof(MCL_Struct_t));
字符串
由于SPI只能按字节传输,uint16_t数据被处理为一个字节,所以我只写了struct_write.a = 0x00110022等。
我如何使我的句柄按字节指向数据?
3条答案
按热度按时间o0lyfsai1#
看起来EEPROM实现似乎是将单个字符视为8字节值,即使系统上的
CHAR_BIT
显然是16(函数签名很可能直接基于char
或unsigned char
)。在这种情况下,您不能直接编写整个结构,尽管这样做无论如何都是有问题的,因为可能存在填充字节(通常,不是在具体情况下)和字节顺序问题。因此,我建议显式地序列化,无论您在哪个架构上,您都可以获得定义良好的行为:
字符串
qojgxg4l2#
如果底层架构在物理上不能进行字节寻址,那么您就不太可能在本机进行寻址,尽管您的问题并不清楚情况是否如此。
如果你的微控制器可以按字节处理(据我所知,我相信应该是这样的),它将是一个简单的转换为
char
类型指针:字符串
否则,您可以使用shift操作来完成,但请记住,这将占用两倍的内存:
型
我建议你进一步研究你的微控制器的架构,并检查指令集架构。
c9x0cxw03#
这里我们有
sizeof(char)
=sizeof(uint16_t)
=sizeof(int)
=1
。char
是一个字节,但一个字节是2个八位字节。八位字节上不可能有指针。如果必须发送/接收八位字节,则必须通过转换函数来完成。
字符串