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

相关推荐
学习路上_write1 天前
stm32板子mpu6050读取的器件ID一直是0xFF
stm32·单片机·嵌入式硬件
2501_915106321 天前
HTTP 协议详解,HTTP 协议在真实运行环境中的表现差异
网络·网络协议·http·ios·小程序·uni-app·iphone
亿道电子Emdoor1 天前
【Arm】MDK查看语句的执行累积时间和次数
stm32·单片机·物联网
Tel199253080041 天前
CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块
单片机·数码相机·物联网·自动化·工业自动化·仪器仪表
l3538o675731 天前
国产POE降压恒压芯片方案选型:48v-52v输入转5v-12v/1-3A电源芯片
人工智能·科技·单片机·嵌入式硬件·电脑·智能家居
v先v关v住v获v取1 天前
建筑材料上楼搬运机结构设计cad3张+三维图+设计说明书
科技·单片机·51单片机
JSMSEMI111 天前
SC6D10170H-JSM 碳化硅肖特基二极管
stm32·单片机·嵌入式硬件
roman_日积跬步-终至千里1 天前
【Starrocks】StarRocks 排错:`Invalid method name: ‘heartbeat‘`(BE 心跳端口/协议错误)
服务器·网络·php
松涛和鸣1 天前
34、 Linux IPC进程间通信:无名管道(Pipe) 和有名管道(FIFO)
linux·服务器·c语言·网络·数据结构·数据库
叽里咕噜怪1 天前
Ansible Playbook 从入门到精通:零基础玩转自动化部署与配置管理
网络·自动化·ansible