C 带无序数据字段的硬件寄存器建模
我的记忆结构如下:C 带无序数据字段的硬件寄存器建模,c,struct,unions,C,Struct,Unions,我的记忆结构如下: struct { uint16_t MSB_VALUE : 8; uint16_t : 8; uint16_t LSB_VALUE; } BIG_VALUE; 这种结构总共表示由硬件固定的32位内存部分。大_值的值可以使用Verilog串联表示法表示,因此: BIG_VALUE = { MSB_VALUE[7:0], LSB_VALUE[15:0] } 我希望能够编写一个并集(或其他东西),这样我就可以使用点符号访问BIG_值的值。也许是像这样愚蠢的事
struct {
uint16_t MSB_VALUE : 8;
uint16_t : 8;
uint16_t LSB_VALUE;
} BIG_VALUE;
这种结构总共表示由硬件固定的32位内存部分。大_值的值可以使用Verilog串联表示法表示,因此:
BIG_VALUE = { MSB_VALUE[7:0], LSB_VALUE[15:0] }
我希望能够编写一个并集(或其他东西),这样我就可以使用点符号访问BIG_值的值。也许是像这样愚蠢的事情:
union {
uint32_t val;
struct {
uint16_t MSB_VALUE : 8;
uint16_t : 8;
uint16_t LSB_VALUE;
} sub;
} BIG_VALUE;
但是,问题是MSB在内存中位于LSB之前(也有8位间隙),因此调用BIG_VALUE.val不会得到期望的值
我对要尝试的东西有一个模糊的想法,但我只是把自己弄糊涂了。在union/struct形式主义中有没有办法做到这一点,或者我现在应该放弃吗?我想,放弃意味着必须手动拆分24位值,然后将其存储到适当的字段中。如果有意义的话,也许我可以稍后编写一个函数来实现这一点
完成这项工作意味着我可以使用点表示法存储一个24位的值,并将数据放入内存中的适当位置。例如:
BIG_VALUE.val = 0x0031FFFE
Then
BIG_VALUE.MSB_VALUE == 0x31
and
BIG_VALUE.LSB_VALUE == 0xFFFE
But the memory layout would be
addr : 0x0031
addr +4 : 0xFFFE
为什么要在16位固定宽度类型上使用8位字段,而不是仅使用8位固定宽度类型(
uint8\t
)?我没有考虑过这样做。然而,最终目标是构建一个表,该表将被写入每个地址16位宽的寄存器。所以,我只是用16位来考虑问题。仅供参考,sizeof(BIG_VALUE)
将>=48位(因为填充)。此外,访问与实例化的联合不同的联合成员在技术上也是无效的。我会对uint8\u t
数组使用malloc
(保证连续内存),并编写适当移位和屏蔽的getter/setter函数。然后,可以使用一个指向基地址的指针使用