联合体(union)

定义案例

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 位完全对齐。

  • **位域顺序**: 取决于编译器和平台(可能从高位到低位或相反),需根据实际场景验证。

拓展

**使用场景**

这种联合体常用于:

  1. **硬件寄存器映射**:直接操作寄存器的特定位。

  2. **通信协议解析**:将数据包按协议格式分解为字段。

  3. **内存优化**:高效利用 32 位空间,同时提供语义化访问。

总结

该联合体通过位域将 32 位数据按功能划分,既支持整体操作,也支持按字段访问,适用于需要精确控制位的场景(如嵌入式系统或协议解析)。

相关推荐
今儿敲了吗1 小时前
计网| 网际控制报文协议(ICMP)
网络·智能路由器
南棱笑笑生2 小时前
20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速
linux·服务器·网络
Johny_Zhao4 小时前
Vmware workstation安装部署微软SCCM服务系统
网络·人工智能·python·sql·网络安全·信息安全·微软·云计算·shell·系统运维·sccm
会员果汁4 小时前
网络实验-VRRP
网络
XiaoCCCcCCccCcccC4 小时前
Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
linux·网络·udp
一只川页4 小时前
arduino平台读取鼠标光电传感器
驱动开发·单片机·嵌入式硬件·计算机外设
獨枭4 小时前
Visual Studio 2022 跨网络远程调试
网络·ide·visual studio
深度学习04074 小时前
【网络实验】-BGP-EBGP的基本配置
网络·智能路由器
阿斯顿法国红酒快5 小时前
Windows系统安全加固
网络·windows·安全·网络安全·系统安全·ddos
sun0077006 小时前
windows 10 做服务器 其他电脑无法访问,怎么回事?
运维·服务器·网络