前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >结构体位域和__attribute__ ((__packed__))一起用

结构体位域和__attribute__ ((__packed__))一起用

作者头像
用户9736681
发布2023-09-01 13:26:48
1530
发布2023-09-01 13:26:48
举报
文章被收录于专栏:嵌入式随笔嵌入式随笔

1 结构体位域

1.1 位域

位域是一种节省空间的数据结构,是把一个数据类型按照二进制(二进位)划分为几个不同的区域,并说明每个区域的位数。

比如有一个字节,每一位表示一个开关状态,就可以使用位域,解析也方便。

代码语言:javascript
复制
struct test{unsigned char test1:1;unsigned char test2:1;unsigned char test3:1;unsigned char test4:1unsigned char test5:1;unsigned char test6:1;
unsigned char test7:1;
unsigned char test8:1;}

这样收到1字节数据赋值给test,解析每个位的状态直接使用test.test1.....test.test6就可以,不需要再进行相应的位与操作之类的。还可以节省空间。要注意大小端,小端的test1是低位。

1.2位域的具体存储规则如下:

1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。

2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始。

代码语言:javascript
复制
struct test{
unsigned char test1:1;
unsigned char test2:4;
unsigned char test3:4;
unsigned char test4:1;
unsigned char test5:1;
unsigned char test6:1;
unsigned char test7:1;
unsigned char test8:1;
}

举例,这个test结构体,成员test3+test2+test1的位宽为9,大于char的8位,那从test3开始就要从第2个字节开始存。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

3)如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,不建议使用,也没啥使用的必要。

4)如果位域字段之间穿插着非位域字段,则不进行压缩。

5)整个结构体的总大小为最宽基本类型成员大小的整数倍,和普通结构体一样。

2 __attribute__((packed))

__attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。

__attribute__关键字主要是用来在函数或数据声明中设置其属性。

3 联合使用

对于一些特殊的协议,比如sbus,sbus一个通道占11位,那按照位域的规则,下属代码中的channel3就要在存储在下一个unsigned int中了。就不满足我们直接利用编译器解析数据的目的了。

代码语言:javascript
复制
struct sbus_test{    unsigned int channel1: 11;    unsigned int channel2: 11;    unsigned int channel3: 11;    unsigned int channel4: 11;    unsigned int channel5: 11;    ...} __attribute__ ((__packed__));

使用__attribute__ ((__packed__))处理,是可以使数据一个挨着一个,直接读取数据了。对于一些这种特殊协议的,这样联合使用比较方便。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 结构体位域
    • 1.1 位域
      • 1.2位域的具体存储规则如下:
      • 2 __attribute__((packed))
      • 3 联合使用
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档