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】欢迎添加关注!文章转载请注明出处。

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

    关注

    5186

    文章

    20143

    浏览量

    328668
  • 嵌套
    +关注

    关注

    0

    文章

    16

    浏览量

    8117
  • 结构体
    +关注

    关注

    1

    文章

    131

    浏览量

    11296

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    共用声明

    共用也称联合体。 和结构还是有点像: union 共用名称 { 成员1; 成员2; 成员3; }; 但是两者有本质的不
    发表于 12-05 07:24

    中科曙光入选首批天津市卓越工程师培养联合体成员单位

    11月23日,天津市卓越工程师培养联合体成立仪式暨天津大学国家卓越工程师学院高质量建设发展会议在天津大学北洋园校区隆重举行。中科曙光作为联合体首批成员单位受邀出席,总裁助理杨鸿轩代表企业参会,与政府、高校及产业界代表共同见证联合体
    的头像 发表于 11-28 16:42 516次阅读

    C语言的编程技巧

    一个成员是一个未知大小的数组,适用于动态分配内存并关联一个可变长度的数组。‌ ‌3、匿名结构联合体‌:C语言允许在
    发表于 11-27 06:46

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达
    发表于 11-25 07:48

    单片机启动&库函数的构成

    ,由C语言联合体结构的特性,内部的地址是基地址累加的,只需要一个寄存器累加固定的偏移量,就能把结构
    发表于 11-18 08:15

    C语言结构使用

    型的数据组合。 结构的声明与定义 结构的声明一般形式为: c struct 结构
    发表于 11-12 08:30

    开鸿智谷加入创新联合体,共推先进制造业与人力资源服务融合发展

    为深入贯彻人才强国与制造强国战略,助力构建现代化产业体系,湖南湘江新区正式启动“人力资源服务助力先进制造业高质量发展创新联合体”(以下简称“创新联合体”)建设工作,并于11月1日在长沙人力资源服务
    的头像 发表于 11-03 17:21 1063次阅读
    开鸿智谷加入创新<b class='flag-5'>联合体</b>,共推先进制造业与人力资源服务融合发展

    元萝卜破局智能养老:携联合体攻坚场景,以“心价比”升级情绪价值

    近日,在工业和信息化部、民政部联合推动的智能养老服务机器人结对攻关与场景应用试点工作背景下,商汤科技旗下家用机器人品牌“元萝卜”成功入选试点名录,并受邀加入由润泽牵头打造的“智能养老机器人创新联合体
    的头像 发表于 09-15 11:52 269次阅读
    元萝卜破局智能养老:携<b class='flag-5'>联合体</b>攻坚场景,以“心价比”升级情绪价值

    C语言结构联合体的深度解析:内存布局与应用场景

    :实现可变类型数据存储,节省内存空间 3.2 联合体内存操作 union MemoryTest { struct { char a; int b; } s; double c
    发表于 04-08 09:18

    长沙新一代信息技术产教联合体正式成立,拓维信息当选理事长单位

    3月22日,“长沙新一代信息技术产教联合体成立大会暨第一届理事会议”在湖南商务职业技术学院隆重启幕。会上,长沙新一代信息技术产教联合体正式成立,拓维信息当选理事长单位,拓维信息旗下开鸿智谷当选
    的头像 发表于 03-26 17:48 866次阅读
    长沙新一代信息技术产教<b class='flag-5'>联合体</b>正式成立,拓维信息当选理事长单位

    产教新篇|长沙新一代信息技术产教联合体扬帆启航!

    在深化现代教育体系建设的主轴推动下,我国职业教育正以市域产教联合体和行业产教融合共同体为双翼,构建起教育链、人才链与产业链、创新链深度融合的新格局。2025年3月22日,“长沙新一代信息技术产教
    的头像 发表于 03-24 18:09 755次阅读
    产教新篇|长沙新一代信息技术产教<b class='flag-5'>联合体</b>扬帆启航!

    全套C语言培训资料—PPT课件

    全套C语言培训资料,共427页,13个章节:C语言概述、程序的灵魂—算法、数据类型 & 运算符与表达式、顺序程序设计、选择结构程序设
    发表于 03-12 14:50

    技术干货驿站 ▏深入理解C语言嵌套循环与循环控制的底层原理

    大家好!在上一节中,我们学习了C语言中的基本循环语句,如for、while和do...while循环。今天,我们将进一步探讨嵌套循环和循环控制,这些技巧可以帮助我们实现更复杂的逻辑操作
    的头像 发表于 02-21 18:26 1036次阅读
    技术干货驿站  ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>嵌套</b>循环与循环控制的底层原理

    商汤科技与多家厂商共同成立语料终端创新联合体

    近日,由中央广播电视总台、上海市人民政府共同主办的2024科创大会在上海落下帷幕。期间,商汤科技与上海库帕思科技有限公司、上海阡视科技有限公司、以及国产主流芯片等共19家厂商共同成立语料终端创新联合体
    的头像 发表于 12-16 13:46 1569次阅读

    拓维信息参与牵头组建!长沙新一代信息技术产教联合体正式获批

    近日,由长沙市教育局和长沙市工业和信息化局联合发布的《2024年长沙市市级市域产教联合体名单》正式公布。其中,由长沙高新区麓谷产业园(长沙信息产业园)、拓维信息、湖南商务职业技术学院共同牵头组建
    的头像 发表于 12-07 01:06 1207次阅读
    拓维信息参与牵头组建!长沙新一代信息技术产教<b class='flag-5'>联合体</b>正式获批