定义案例
cpp
//CAN通信标识符结构
union TCANEXID
{
u32 All;
struct{
unsigned DataSeg : 8; //数据段
unsigned DestAddr : 8; //目标地址
unsigned SourAddr : 7; //源地址
unsigned RQ : 1; //帧类型,应答,查询
unsigned Command : 3; //命令
unsigned Priority : 2; //优先权
unsigned reserve : 3; //对齐
}Bits;
};
解读
这段代码定义了一个名为 `TCANEXID` 的联合体(`union`),用于将一个 32 位无符号整数(`u32 All`)按位分解为多个具有特定功能的字段。联合体的作用是让同一块内存空间可以通过不同方式访问:既可以作为整体 `All` 操作,也可以按位段 `Bits` 单独操作。
**联合体结构解析**
**1. 联合体成员 `All`**
-
**类型**: `u32`(32 位无符号整数)
-
**作用**: 直接访问整个 32 位数据,用于一次性读写完整的值。
**2. 结构体成员 `Bits`**
通过位域(bit-field)将 32 位划分为多个功能段:
| 字段名 | 位宽 | 说明 |
|--------------|------|--------------------------------------------------------------------|
| `DataSeg` | 8 | **数据段**:可能用于存储数据长度、类型或其他标识信息。 |
| `DestAddr` | 8 | **目标地址**:表示数据的目的地址,范围 0~255。 |
| `SourAddr` | 7 | **源地址**:表示数据的来源地址,范围 0~127。 |
| `RQ` | 1 | **帧类型标志**:用于区分帧是请求(Request)、查询(Query)或应答(Response)。 |
| `Command` | 3 | **指令**:表示具体的操作指令,最多支持 8 种命令(0~7)。 |
| `Priority` | 2 | **优先级**:定义数据的处理优先级,支持 4 个级别(0~3)。 |
| `reserve` | 3 | **保留位**:用于对齐或未来扩展,通常置零。 |
**内存布局**
-
**总位数**: `8 + 8 + 7 + 1 + 3 + 2 + 3 = 32`,与 `u32` 的 32 位完全对齐。
-
**位域顺序**: 取决于编译器和平台(可能从高位到低位或相反),需根据实际场景验证。
拓展
**使用场景**
这种联合体常用于:
-
**硬件寄存器映射**:直接操作寄存器的特定位。
-
**通信协议解析**:将数据包按协议格式分解为字段。
-
**内存优化**:高效利用 32 位空间,同时提供语义化访问。
总结
该联合体通过位域将 32 位数据按功能划分,既支持整体操作,也支持按字段访问,适用于需要精确控制位的场景(如嵌入式系统或协议解析)。