联盟内的数据结构(C编程)

时间:2016-10-08 23:39:05

标签: c data-structures unions atmega atmel

任何时候结构都被扔进其他结构中我只是因某些原因而感到困惑。我正在为I2C(2线串行接口)设备编写驱动程序,并且我使用制造商驱动程序作为创建我的驱动程序的参考。我在下面有这个联合声明(在头文件中定义),我不能理解其中的几行。只是简短的背景知识,你知道你在看什么是下面的主要片段是设置这个TWI_statusReg变量,每当我通过I2c总线发送/接收数据时,该变量保存来自状态寄存器的信息。该数据寄存器长8位,属于Atmel Atmega328P微控制器。这是我的问题......

1。)很难用文字表达这个问题,但你能否简单地解释为什么你会在这样的联合结构中声明一个数据结构?我应该从中找出哪些关键点?

2。)在" .c"标题定义文件太长,无法在此处发布,有一行代表以下

TWI_statusReg.all = 0;

我知道头文件中有一个char变量,名为' all'如下面的主要代码片段所示。但是,我不明白当它被指定为零时会发生什么。这是否将状态寄存器中的所有位设置为零?

3。)两行

unsigned char lastTransOK:1;
unsigned char unusedBits:7; 

特别让我感到困惑的是结肠操作员正在做什么。

CODE的主要片段

/****************************************************************************
  Global definitions
****************************************************************************/

union TWI_statusReg                       // Status byte holding flags.
{
    unsigned char all;
    struct
    {
        unsigned char lastTransOK:1;      
        unsigned char unusedBits:7;
    };
};

extern union TWI_statusReg TWI_statusReg;

1 个答案:

答案 0 :(得分:0)

1)写这种联盟的主要原因是方便。每次需要访问特定位时,不需要手动进行位掩码,现在您可以使用这些位的别名。

2)联合允许你引用内存,就好像它的组件是代表不同类型的不同变量一样。联盟只为其中最大的组件分配空间。所以,如果你有

union Example {
      char bytes[3];
      uint32_t num;
};

这样的联合会占用4个字节,因为它的最大类型uint32_t占用4个字节的空间。尽管如此,拥有这样的联盟可能更有意义,因为无论如何你都在使用那个空间,这样更方便:

union Example {
      char bytes[4];
      uint32_t num;
};

bytes数组将允许您访问num的单个字节。

你的猜测是正确的 - 向所有人写入值将设置联合的相应位。

3)这个构造被称为bit field,并且是内存使用的优化 - 如果你使用2个字符的结构,它实际上需要2个字节的内存空间,相反,如果你声明一点字段只需1个字节(还有6个“未使用”位)