Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带无序数据字段的硬件寄存器建模_C_Struct_Unions - Fatal编程技术网

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函数。然后,可以使用一个指向基地址的指针使用 MeMCPY < /C>。在C语言中这很好。C11标准的某个地方有一个脚注澄清了这一点,但我现在还没有看到它。