0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言:结构体、联合体嵌套使用的实用操作

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:ZhengNL 2020-12-24 16:07 次阅读

结构体、联合体是C语言中的构造类型,结构体我们平时应该都用得很多。但是,对于联合体,一些初学的朋友可能用得并不多,甚至感到陌生。我们先简单看一下联合体:

在C语言中定义联合体的关键字是union。

定义一个联合类型的一般形式为:

o4YBAF_kTH2ASU7cAAALBPU_crU972.jpg

成员表中含有若干成员,成员的一般形式为:类型说明符 成员名。其占用的字节数与成员中最大数据类型占用的字节数。

下面我们一起看一下结构体、联合体结合使用在C语言、嵌入式中的一些实用技巧。

1、应用于管理不同的数据

示例代码:

pIYBAF_kTKSAYsn0AAAvhx5Njr8516.jpg

pIYBAF_kTK2AT4BbAAAz7_tIWEE254.jpg

这里把struct data_pkg1、struct data_pkg2、struct data_pkg3三个结构体放到了struct data_pkg这个结构体里进行管理,把data_pkg_type与union里的三个结构体建立一一对应关系,我们需要用哪一结构体数据就通过data_pkg_type来进行选中。

在进行数据组包的时候,先给data_pkg_type进行赋值,确定数据包的类型,再给对应的union里的结构体进行赋值;在进行数据解析的时候,通过data_pkg_type来选择解析哪一组数据。

思考一下,如果在union里面再嵌套一层union会怎么样?会变得更复杂?以前的话,我会觉得越嵌套会越复杂,我也很抵制这种不断嵌套的做法。但后来看了我同事鱼鹰(公众号:鱼鹰谈单片机)的设计之后,我惊呆了!这可太秀了,他就是这么嵌套使用把原本复杂的系统数据管理得明明白白的。我们看他怎么设计的(看个大概的图):

026aa44e-45b9-11eb-8b86-12bb97331649.png

可以看到最左边和最右边这就建立起了一一对应关系,我们的模块很多,数据很多,但是在这样的设计中显得很清晰、很容易维护。

2、寄存器、状态变量封装

我们看一看TI的寄存器封装是怎么做的:

028a5b22-45b9-11eb-8b86-12bb97331649.jpg

所有的寄存器被封装成联合体类型的,联合体里边的成员是一个32bit的整数及一个结构体,该结构体以位域的形式体现。这样就可以达到直接操控寄存器的某些位了。比如,我们要设置PA0引脚的GPAQSEL1寄存器的[1:0]两位都为1,则我们只操控两个bit就可以很方便的这么设置:

GpioCtrlRegs.GPAQSEL1.bit.GPIO0=3

或者直接操控整个寄存器:

GpioCtrlRegs.GPAQSEL1.all|=0x03

位域相关文章:【C语言笔记】位域

如果不是工作于芯片原厂,寄存器的封装应该离我们很远。但我们可以学习使用这种方法,然后用于我们的实际应用开发中。

下面就看一种实际应用:管理一些状态变量。

示例代码:

pIYBAF_kTMmAcyktAABR0ARgCGc443.jpg

之前记得群里有一位小伙伴问系统有几十个状态变量需要管理,怎么做比较好。如上例子就是比较好的一种管理方法。

3、数据组合/拆分、大小端

(1)验证大小端

pIYBAF_kTPCAVrnoAABB04oNop4479.jpg

运行结果:

(2)数据组合、拆分

这其实也就是上一篇文章《面试题 | 获取整数各个字节》介绍的。在数据组合与拆分之前首先需要确实当前平台的大小端。比如小编使用的平台是小端模式。

① 把0x12345678拆分成0x78、0x56、0x34、0x12:

o4YBAF_kTSGAROAeAAA_--daXRo074.jpg

运行结果:

② 把0x78、0x56、0x34、0x12组合成0x12345678:

o4YBAF_kTUKAAHCMAAA4_FuxDko418.jpg

pIYBAF_kTUqAMsqXAAAzGB7a9xw594.jpg

运行结果:

032a6a04-45b9-11eb-8b86-12bb97331649.png

但是数据组合与拆分有更好的方法:移位操作。篇幅有限不再贴出代码,详细代码可参考:《面试题 | 获取整数各个字节》、《C语言、嵌入式位操作精华技巧大汇总》两篇文章。

4、结构体 & 缓冲区

pIYBAF_kTV6AS8IwAAAv_6_wSi8648.jpg

这种应用得很广泛,用于自定义通信协议。struct里面的内容可以设计得很简单,比如全是有用的数据,或是设计得很复杂,包含一些协议头尾、包长、有效数据、校验等内容。

但无论如何,我们组包发送的过程是填充结构体->发送data_buffer;反之接收数据解析的过程就是接收数据存于data_buffer->使用结构体数据。我们之前分享的《干货 | protobuf-c之嵌入式平台使用》也是这个思路。

5、传输浮点数据

pIYBAF_kTZeAFivbAAAUjFMIi9I723.jpg

类似的,使用这样子的方法可以用于传输浮点数,更具体地不再展开,网络上有很多这一块的资料。感兴趣的朋友可以自己操作验证验证。

责任编辑:xj

原文标题:结构体、联合体嵌套使用的实用操作!

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4982

    文章

    18281

    浏览量

    288448
  • 嵌套
    +关注

    关注

    0

    文章

    14

    浏览量

    7800
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750

原文标题:结构体、联合体嵌套使用的实用操作!

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    天津车联网技术创新联合体,正式成立!

    3月22日,天津经纬恒润有限公司携手12家京津冀三地优质企业及高校共同成立的车联网技术创新联合体举行揭牌仪式。大会介绍了各成员单位的业务情况、研发计划和2024年度联合体的整体工作计划,为联合体
    的头像 发表于 03-26 10:00 284次阅读
    天津车联网技术创新<b class='flag-5'>联合体</b>,正式成立!

    天津经纬携优质企业及高校成立的车联网技术创新联合体举行揭牌仪式

    3月22日,天津经纬恒润有限公司携手12家京津冀三地优质企业及高校共同成立的车联网技术创新联合体举行揭牌仪式。
    的头像 发表于 03-25 10:22 184次阅读
    天津经纬携优质企业及高校成立的车联网技术创新<b class='flag-5'>联合体</b>举行揭牌仪式

    华为联合24家企事业单位发起“大模型应用产业联合体

    华为联合24家企事业单位发起“大模型应用产业联合体” 据央视《新闻联播》报道 日前,华为联合智谱AI、医渡科技、百川智能、中国科学院自动化研究所、中软国际、首都在线、第四范式、格灵深瞳、中科
    的头像 发表于 03-02 15:55 1028次阅读

    北京24家企事业单位组建&quot;大模型应用产业联合体&quot; 

    据悉,此联合体旨在利用华为鲲鹏硬件底座与软件底层资源,推动人工智能产业生态合作,确立相关行业标准,并实现人工智能产业的快速升级。
    的头像 发表于 03-01 14:44 367次阅读

    思必驰入选“2023年度江苏省创新联合体建设试点”名单

    近日,江苏省科技厅公布了2023年度江苏省创新联合体拟建设试点名单,其中,由思必驰科技股份有限公司(以下简称:思必驰)牵头组建的江苏省人工智能语言计算创新联合体成功入选,也是全省5家省创新联合
    的头像 发表于 01-22 13:47 464次阅读

    优必选科技参与成立“人形机器人创新发展联合体

    在2023年的一场足式、人形机器人生态峰会上,一个名为“移动机器人产业联盟人形机器人创新发展联合体”的全新组织正式亮相。作为人形机器人行业的佼佼者,优必选科技不仅积极参与,更是与其他11家在人形机器人产业链上具有代表性的企业共同发起了这一联合体
    的头像 发表于 12-29 15:03 388次阅读

    【喜讯】芯盾时代当选“北京市高级别自动驾驶示范区智能网联汽车市域产教联合体”理事单位

    近日,北京市高级别自动驾驶示范区智能网联汽车市域产教联合体(以下简称“产教联合体”)成立大会在北京经开区举行,由66家政产学研单位共同组成的产教融合平台正式成立。芯盾时代作为产教联合体中唯一的业务
    的头像 发表于 12-22 14:40 202次阅读
    【喜讯】芯盾时代当选“北京市高级别自动驾驶示范区智能网联汽车市域产教<b class='flag-5'>联合体</b>”理事单位

    科沃斯组建的苏州市机器人前沿智能技术创新联合体成功获批

    近日,苏州市科技局公示了2023年度第二批(总第四批)苏州市创新联合体立项名单,由科沃斯机器人股份有限公司牵头组建的苏州市机器人前沿智能技术创新联合体成功获批。
    的头像 发表于 11-28 09:28 978次阅读

    北京集成电路产教联合体等入选!教育部公布首批市域产教联合体名单

    建设市域产教联合体是全面贯彻党的二十大精神,加强职业教育的适应性和吸引力的重要举措,也是深化产业——教育的融合,地区经济发展的重要途径,是为人民服务,教育链、人才链、产业链、创新链紧密结合的重要载体。
    的头像 发表于 10-11 14:13 650次阅读
    北京集成电路产教<b class='flag-5'>联合体</b>等入选!教育部公布首批市域产教<b class='flag-5'>联合体</b>名单

    结构struct和联合体union的区别?

    结构struct和联合体union的区别?
    发表于 10-11 08:21

    易华录发布数据资产评估与入表服务联合体解决方案

    在9月8日举办的数据资产入表服务联合体发布会上, 易华录与中企华、普华永道中国、中国光大银行、北京大成律师事务所、电科网安、北京国际大数据交易所、深圳数交所、贵阳大数据交易所、郑州数据交易中心、开放
    的头像 发表于 09-12 19:25 795次阅读

    芯驰科技加入湖北省车规级芯片产业技术创新联合体

    7月23日,湖北省车规级芯片产业技术创新联合体2023年第一次大会暨创新技术论坛在武汉经开区召开。应东风汽车邀请,芯驰科技出席大会并正式加入创新联合体,与成员单位共研共创“生态圈”,为智能网联汽车行业发展贡献力量。
    的头像 发表于 07-26 10:55 670次阅读

    C语言联合体的巧妙运用

    联合体(Union)是C语言中的一种复合类型,它允许在同一内存区域存储多个不同的数据类型的成员(member),但只能同时存在其中一个成员。
    发表于 06-21 10:59 1165次阅读

    中芯国际、北方华创等22家单位同发力 北京集成电路产教联合体成立

    北京集成电路产教联合体6月8日在北京电子科技职业学院签约成立,同时北京电子科技职业学院成立集成电路学院(人工智能学院)。 北京集成电路产教联合体由北京经济技术开发区管委会牵头,北京电子科技职业学院
    的头像 发表于 06-13 08:42 729次阅读
    中芯国际、北方华创等22家单位同发力 北京集成电路产教<b class='flag-5'>联合体</b>成立

    看一下结构体、联合体结合使用在C语言与嵌入式中的一些实用技巧

    结构体、联合体是C语言中的构造类型,结构体我们平时应该都用得很多。但是,对于联合体,一些初学的朋友可能用得并不多,甚至感到陌生。
    发表于 05-08 10:19 3897次阅读
    看一下<b class='flag-5'>结构</b>体、<b class='flag-5'>联合体</b>结合使用在C<b class='flag-5'>语言</b>与嵌入式中的一些实用技巧