我有一个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
答案 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添加更多变量,则内存效率会更高。