【发布时间】:2016-10-08 23:39:05
【问题描述】:
任何时候结构都被扔进其他结构中,我只是出于某种原因感到困惑。我正在为 I2C(2 线串行接口)设备编写驱动程序,并使用制造商驱动程序作为创建我的驱动程序的参考。我在下面有这个联合声明(在头文件中定义),我只是无法理解其中的几行。只是一个简短的背景,所以你知道你在看什么是下面的主要 sn-p 设置这个 TWI_statusReg 变量,每次我通过 I2c 总线发送/接收数据时,它都会保存来自状态寄存器的信息。该数据寄存器为 8 位长,属于 Atmel Atmega328P 微控制器。这是我的问题...
1.) 这个问题很难用语言来表达,但是你能用简单的术语解释一下为什么你会在这样的联合结构中声明一个数据结构吗?我应该从中挑出哪些关键点?
2.) 在“.c”头文件定义文件太长,无法在此处发布,有一行内容如下
TWI_statusReg.all = 0;
我知道头文件中有一个名为“all”的 char 变量,如下面代码的主要 sn-p 所示。但是,我不明白当它被分配为零时会发生什么。这是否将状态寄存器中的所有位都设置为零?
3.) 两行
unsigned char lastTransOK:1;
unsigned char unusedBits:7;
让我特别困惑的是冒号运算符在做什么。
CODE的主要sn-p
/****************************************************************************
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;
【问题讨论】:
-
冒号运算符指定用于该字段的位数。
-
而且位域是不可移植的。我知道没有任何独立于平台的方式可以知道
all的哪一位对应于lastTansOK位。它可能是第一位,也可能是最后一位。如果你使用不同的编译器,它可能会改变。 -
如果
TWI_statusReg.all = 0;在头文件中(在inline函数或宏之外,它对代码质量的影响非常糟糕。你的问题很困惑和不清楚。最好是得到一本 C 书并阅读有关structs 和unions 的部分。 -
@AndrewHenle 以下行在现有驱动程序中被大量使用.......TWI_statusReg.lastTransOK = TRUE;........但是,我明白你的意思没有办法知道。
-
@Code-Apprentice 它不是运算符(运算符对表达式进行操作)
标签: c data-structures unions atmega atmel