打包结构位域与#define'd位掩码

时间:2013-09-12 13:25:55

标签: c data-structures avr avr-gcc

我有一个AVR程序,它在静态状态变量中存储一组(通常少于8个)位标志(它包含在一个包含模块的各种其他状态字段的结构中)。

如果这样做的效率更高或更低:

#define STATUS_ENABLED 0x01

struct DeviceState {
    uint8_t status;
}

static struct DeviceState myState;

//and somewhere in the program...
myState.status |= STATUS_ENABLED;

或者使用打包的位域:

struct DeviceState {
    uint8_t enabled : 1;
}

static struct DeviceState myState;

//and somewhere in the program...
myState.enabled = 1; // could use TRUE/FALSE if defined

3 个答案:

答案 0 :(得分:2)

使用avr-gcc 4.3.3,似乎实现没有区别:

#define STATUS_ENABLE

struct DeviceState {
    uint8_t status;
    uint8_t enabled : 1;
}

static struct DeviceState myState;

//and this code...
myState.status |= STATUS_ENABLED;
myState.enabled = 1;

生成以下汇编代码:

    myState.status |= STATUS_ENABLE;
00003746  LDS R24,0x20B5            Load direct from data space 
00003748  ORI R24,0x01              Logical OR with immediate 
00003749  STS 0x20B5,R24            Store direct to data space 

    myState.enabled = TRUE;
0000374B  LDS R24,0x20B4            Load direct from data space 
0000374D  ORI R24,0x01              Logical OR with immediate 
0000374E  STS 0x20B4,R24            Store direct to data space 

所以相同的说明(除了地址!)。

答案 1 :(得分:2)

位字段版本是不可移植的,并且位的实际位置定义不明确。除此之外,应该没有差异。因此,请使用以前的版本,因为它是100%便携式的。

答案 2 :(得分:-2)

压缩位域允许您在8位存储空间中存储其他变量,因此如果要向DeviceStatus添加更多变量,则内存效率会更高。