嵌入式C中struct与union的区别 在本系列的上一篇文章中,我们讨论了嵌入式C中的结构允许我们对不同数据类型的变量进行分组并将它们作为单个数据对象进行处理。 除了结构之外,C语言还支持另一个称为联合的数据结构,该结构可以将不同的数据类型组合为一个数据对象。本文将提供有关工会的一些基本信息。我们首先来看一个声明并集的介绍性示例,然后研究该数据对象的重要应用。 入门实例声明一个联合就像声明一个结构。我们只需要将关键字“ struct”替换为“ union”即可。考虑以下示例代码: uniontest{ uint8_tc; uint32_ti; }; 这指定了一个模板,该模板具有两个成员:“ c”(占用一个字节)和“ i”(占用四个字节)。 现在,我们可以创建该联合模板的变量: uniontestu1; 使用成员运算符(。),我们可以访问“ u1”联合的成员。例如,以下代码将10分配给上述联合的第二个成员,并将“ c”的值复制到“ m”变量(其类型必须为uint8_t)。 u1.i=10; m=u1.c; 将分配多少存储空间来存储“ u1”变量?尽管结构的大小至少等于其成员的大小之和,但并集的大小等于其最大变量的大小。分配给工会的内存空间将在所有工会成员之间共享。在上面的示例中,“ u1”的大小等于uint32_t的大小,即四个字节。此存储空间在“ i”和“ c”之间共享。因此,为这两个成员之一分配值将更改另一个成员的值。 您可能想知道,“使用相同的内存空间来存储多个变量有什么意义?此功能有什么应用程序?” 我们将在下一部分中探讨此问题。 我们需要共享的内存空间吗? 让我们看一个示例,其中联合可以是有用的数据对象。假定,如下图1所示,系统中有两个设备需要相互通信。 图1 “设备A”应将状态,速度和位置信息发送到“设备B”。状态信息由三个变量组成,这些变量指示电池电量,操作模式和环境温度。该位置由两个变量表示,这些变量显示了x轴和y轴的位置。最后,速度由单个变量表示。假定这些变量的大小如下表所示。 如果“设备B”需要不断获取所有这些信息,我们可以将所有这些变量存储在结构中,并将该结构发送到“设备B”。结构大小将至少等于这些变量的大小之和,即9个字节。 struct{ uint8_tpower; unit8_top_mode; uint8_ttemp; }status; struct{ uint16_tx_pos; unit16_ty_pos; }position; 现在,我们可以将这些结构与“ vel”变量一起放在一个并集中: union{ struct{ uint8_tpower; unit8_top_mode; uint8_ttemp; }status; struct{ uint16_tx_pos; unit16_ty_pos; }position; uint16_tvel; }msg_union; 上面的代码指定了联合模板,并创建了该模板的变量(名为“ msg_union”)。在该联合内部,有两个结构(“状态”和“位置”)和一个两个字节的变量(“ vel”)。此联合的大小将等于其最大成员的大小,即“位置”结构,该结构占用四个字节的内存。此存储空间在“状态”,“位置”和“ vel”变量之间共享。 struct{ uint8_tmsg_type; union{ struct{ uint8_tpower; unit8_top_mode; uint8_ttemp; }status; struct{ uint16_tx_pos; unit16_ty_pos; }position; uint16_tvel; }msg_union; }message; 我们可以为“ msg_type”变量考虑三个可能的值:“ s”表示“状态”消息,“ p”表示“位置”消息,“ v”表示“速度”消息。现在,我们可以将“消息”结构发送到“设备B”,并使用“ msg_type”变量的值作为消息类型的指示符。例如,如果接收到的“ msg_type”的值为“ p”,则“设备B”将知道共享内存空间包含两个2字节变量。 |
发布评论请先 登录
相关推荐
评论