联合体(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 位数据按功能划分,既支持整体操作,也支持按字段访问,适用于需要精确控制位的场景(如嵌入式系统或协议解析)。

相关推荐
charlie11451419124 分钟前
计算机网络笔记再战——理解几个经典的协议2
网络·笔记·网络协议·计算机网络·协议·基础学习
hgdlip27 分钟前
ip归属地是不是要打开定位?
服务器·网络·tcp/ip
mischen5202 小时前
sentinel的限流原理
java·网络·sentinel
cherry_rainyyy2 小时前
51单片机 01 LED
stm32·单片机·嵌入式硬件
color_leo4 小时前
zephyr devicetree
单片机·嵌入式硬件·mcu
宣宣猪的小花园.4 小时前
STM32单片机学习记录(2.2)
stm32·单片机·嵌入式硬件·无人机·空气动力学
liulilittle4 小时前
OPENPPP2 —— VMUX_NET 多路复用原理剖析
网络
exp_add36 小时前
四、GPIO中断实现按键功能
单片机·嵌入式硬件
然然阿然然7 小时前
2025.2.1——八、Web_php_wrong_nginx_config
网络·学习·安全·网络安全·php