1.位域结构体允许指定结构体成员占用的位数,而不是完整的字节或字。这种技术主要用于节省内存空间,特别是在处理硬件寄存器或需要精确控制数据位布局的场景中。struct status_flags {
unsigned int error_flag : 1; // 1位
unsigned int ready_flag : 1; // 1位
unsigned int mode : 2; // 2位
unsigned int reserved : 4; // 4位
};
位域结构体主要用于操作寄存器,也称为寄存器结构体,需要注意以下几点:
1.1个位域必须存储在同1个字节中,不能跨两个字节存储,如果1个字节所剩空间不够存放另1个位域时,剩余的空间应该使用空域填充或无名位域填充,然后从下一个单元存放这个位域,也就是结构体需要占满8位。
例如:struct{
unsigned a:4
unsigned :0 //空域,声明本字节的剩余位不再使用
unsigned b:4 //从下个单元开始存放
unsigned c:4
}TwoByte;
优点:
节省空间:可以将多个布尔值或小范围整数打包到一个字节中
硬件接口:常用于与硬件寄存器交互,匹配硬件定义的位布局
可移植性问题:位域的具体实现依赖于编译器,不同平台可能有不同行为。
访问效率:某些平台上访问位域可能比访问普通变量慢
注意事项
位域成员不能取地址(因为可能不足一个字节)
位域的布局顺序(从左到右还是从右到左)由实现定义
宽度为0的位域表示强制对齐到下一个存储单元边界
位域通常用于无符号类型,有符号位域的行为可能因编译器而异
位域结构体的使用案例:
// 控制硬件设备的寄存器
typedef struct {
unsigned int enable : 1; // 使能位 (0=禁用, 1=启用)
unsigned int mode : 2; // 模式选择 (00=模式A, 01=模式B, 10=模式C)
unsigned int speed : 3; // 速度设置 (000=最低, 111=最高)
unsigned int reserved : 2; // 保留位
} DeviceControlReg;
volatile DeviceControlReg *reg = (DeviceControlReg *)0xFFFF0000;
reg->enable = 1;
reg->mode = 2;
reg->speed = 7;
位域变量的使用方式和结构成员的使用方式相同,如下
位于变量名.位域名
位于变量指针->位域名
如下所示是《能源网管》项目定义的一个位域结构体,用于存放modbus中寄存器状态值,
typedef struct{
uint8_t comp_1_status:1;// Compressor 1 status
uint8_t comp_2_status:1;// Compressor 2 status
uint8_t comp_3_status:1;// Compressor 3 status
uint8_t cool_status:1;// Cooling on //
uint8_t dehum_status:1;// Dehumidify on//除湿
uint8_t alarm:1;// Critical alarm//严重的
uint8_t heat_status:1;// Heating on//加热
uint8_t Heater_1_status:1;// Heater 1 status//加热器
uint8_t Heater_2_status:1;// Heater 2 status
uint8_t hum_status:1;// Humidify on//加湿
uint8_t hum_high_current_alarm:1;// Alarm Humidifier high current
uint8_t fan_status:1;// Fan on / Unit on
uint8_t air_flow_fail_alarm:1;// Alarm air flow fail//气流丢失
uint8_t filter_block_alarm:1;// Alarm filter block//过滤器
uint8_t high_hum_alarm:1;// Alarm high humidity//高湿
uint8_t high_tmp_alarm:1;// Alarm high temperature//高温
uint8_t comp_1_high_pressure_alarm:1;// Alarm comp. 1 high pressure
uint8_t comp_2_high_pressure_alarm:1;// Alarm comp. 2 high pressure
uint8_t heater_over_heat_alarm:1;// Alarm Heater Over Heat//加热器过热
uint8_t low_hum_alarm:1;// Alarm low humidity
uint8_t low_tmp_alarm:1;// Alarm low temperature
uint8_t comp_1_low_pressure_alram:1;// Alarm comp. 1 low pressure
uint8_t comp_2_low_pressure_alram:1;// Alarm comp. 2 low pressure
uint8_t unit_health_check_alarm:1;// Alarm Unit Health Check
uint8_t lan_disconnected_alarm:1;// Alarm LAN disconnected
uint8_t unit_run_expired_alarm:1;// Alarm unit run expired
uint8_t water_onfloor_alarm:1;// Alarm water on floor
uint8_t drip_tray_full_alarm:1;// Alarm drip tray full
uint8_t high_conductivity_alarm:1;// Alarm high conductivity
uint8_t low_production_alarm:1;// Alarm low production
uint8_t drain_alarm:1;// Drain alarm
uint8_t cylinder_alarm:1;// Alarm cylinder full
}crac_alarm_t;
std::pair<bool,crac_alarm_t> m_cracAlarm;
typedef struct{
//uint8_t reserve_1:7;
uint8_t dehumidity_status:1;// 是否在除湿模式
uint8_t heater_1_status:1;// 加热器一是否开启
uint8_t heater_2_status:1;// 加热器二是否开启
uint8_t heater_3_status:1;// 加热器三是否开启
uint8_t humidifier_status:1;// 加湿阀是否开启
uint8_t cooler_status:1;// 冷却水泵是否开启
uint8_t spare_output_status:1;// 备用输出是否开启
uint8_t common_alarm:1;// 是否有通用报警
uint8_t freecool_status:1;// 冷冻水阀(或 FreeCool 三通阀)是否开启
}crac_status_t; // 2,0x0,0xf
typedef struct{
uint8_t heater_alarm:1;// 加热器过热报警 0:否 1:是
uint8_t humifity_alarm:1;// 加湿淤塞报警 0:否 1:是
uint8_t leak_alarm:1;// 漏水报警 0:否 1:是
uint8_t fire_alarm:1;// 火警 0:否 1:是
uint8_t flow_alarm:1;// 水流报警 0:否 1:是
}crac_status_3_t;// 2,0x71,0x5
浙公网安备 33010602011771号