【发布时间】:2016-02-10 06:03:58
【问题描述】:
我正在研究微控制器驱动程序文件,但无法理解联合和位域的正确使用
typedef union
{
uint8 U; //Unsigned
sint8 I; //signed
Register_x_Bits B; //Bit field access
}u1;
typedef struct _Register_x_Bits //8 bit register size
{
uint8 Field1:1; //endianness is maintained for all registers
uint8 Field2:1;
uint8 Field3:1;
uint8 Field4:1;
uint8 Field5:4;
}Register_x_Bits;
u1 reg;
reg.U = ReadRegister(); // data is initially being read from the register
//based on the previous data a bit value needs to be changed in particular location of the data
reg.B.Field3 = 0;
WriteRegister(reg.U);
这就是我难以理解的地方
1) 通过仅更改reg.B.Field3 位字段值,它会仅更改一个特定位(在本例中为字段 3)还是清除寄存器中的所有先前数据并用新的reg.B.Field3 填充它
许多教程指出Unions 中只有一个活跃成员
2) 我可以更改同一个寄存器中的多个位域吗? 我可以通过上面相同的方法更改它们并保持剩余的完整吗
reg.B.Field1 =0;
reg.B.Field3 =1;
reg.B.Field4 =1100;
让整个寄存器值为1111 0 1 0 1,现在如果我更改Fields 1,3,4 会影响Fields 0,2 中的值吗?
【问题讨论】:
-
您必须先定义
Register_x_Bits,然后才能在联合定义中使用它。显示的代码不应编译。 (但您可以轻松地颠倒并集和结构的顺序,以便编译。) -
您不能将所有十进制 1100 放入 4 位字段中。你有没有想过 6 作为值? (1100 % 16 是 12,这是您编写的代码所得到的。)
-
分配给
reg.B.Field3不会改变reg.B结构中的其他位。它会影响reg.I和reg.U中的值——实际上,一位会被重置,但哪一位是实现定义的(大多数位字段行为是实现定义的,所以你必须查看实现手册——和如果您拥有的手册中尚未记录该信息,请索取该信息)。 -
Register_x_Bits结构中是否存在拼写错误,因为Field4输入了两次? -
@oysteijo .. 哦,我没注意到……这是一个错字。我现在更正了
标签: c cpu-registers unions bit-fields