您的位置:首页 > 财经 > 产业 > 海南有线微信公众号_代理公司是干什么的_自建站平台_市场调研怎么做

海南有线微信公众号_代理公司是干什么的_自建站平台_市场调研怎么做

2025/2/27 12:32:24 来源:https://blog.csdn.net/TNT_JQR/article/details/145484444  浏览:    关键词:海南有线微信公众号_代理公司是干什么的_自建站平台_市场调研怎么做
海南有线微信公众号_代理公司是干什么的_自建站平台_市场调研怎么做

在进行嵌入式开发时,我们常常会听到这样一句话:“内存就是金钱。” 在嵌入式系统中,内存资源通常是非常稀缺的,尤其是在一些微控制器(如STM32、ESP32等)的开发中,我们需要尽可能地精打细算,优化内存的使用。

那么,你是否知道在C语言中有一个超实用的工具,可以帮助我们在程序中节省内存?它就是我想要介绍的主角:共用体(Union)

一、什么是共用体?

在C语言中,共用体(Union)是一种特殊的数据结构,它允许多个不同类型的变量共享同一段内存空间

听起来很抽象?没关系!先看一个简单的定义:

union Example {int i;        // 整型成员float f;      // 浮点型成员char str[20]; // 字符数组成员
};

上面的union Example中包含了三个成员:

  • 一个整型变量 i
  • 一个浮点型变量 f
  • 一个长度为20的字符串 str

关键点:这三个成员共用一块内存。也就是说,无论你存储的是整数、浮点数还是字符串,它们占用的空间是同一块内存地址

共用体与结构体的区别

在C语言中还有一个类似的概念——struct(结构体)。那么,结构体和共用体有什么区别呢?

特性共用体(Union)结构体(Struct)
内存分配所有成员共用一块内存,大小等于最大成员的大小。每个成员各自分配内存,大小等于所有成员大小的总和。
使用场景节省内存,只能同时使用一个成员。占用更多内存,所有成员可以独立存储并同时使用。
灵活性内存占用小,但操作稍复杂。内存占用大,但逻辑更清晰,操作更方便。

简单总结

        1.如果你需要更灵活的操作且不担心内存占用,选struct

        2.如果你需要节省宝贵的内存,共用体(union)就是你的不二之选!

二、嵌入式开发中的共用体:实战应用

在嵌入式开发中,共用体的应用非常广泛。它不仅能节省内存,还能帮助我们更高效地处理数据。接下来,我们通过几个实际案例,来讲解共用体在嵌入式开发中的用法。

1.数据解析与存储优化

在嵌入式系统中,我们经常需要处理从外设(如传感器、通信模块)接收到的数据,这些数据可能是以字节(Byte)或二进制形式传输的。而共用体可以帮助我们轻松地在不同数据类型之间转换。

例如,有一个16位的传感器数据,通过共用体可以拆分成两个8位的字节进行处理:

#include <stdio.h>// 定义共用体
union SensorData {unsigned short fullData;  // 16位整型struct {unsigned char lowByte;  // 低8位unsigned char highByte; // 高8位} bytes;
};int main() {union SensorData data;// 模拟接收到16位数据data.fullData = 0x1234; // 假设传感器返回的16位数据// 访问高低字节printf("高字节: 0x%X\n", data.bytes.highByte);printf("低字节: 0x%X\n", data.bytes.lowByte);return 0;
}

运行结果

高字节: 0x12
低字节: 0x34

通过这种方法,我们可以轻松地对传感器数据进行拆分,而不需要额外消耗内存。

2.实现简单的类型转换

在嵌入式开发中,有时候需要将浮点数的二进制表示存储到某些寄存器中,这时候可以使用共用体实现类型转换。

例如:

#include <stdio.h>// 定义共用体
union FloatConverter {float f;       // 浮点数unsigned char bytes[4]; // 字节数组
};int main() {union FloatConverter converter;// 设置浮点数converter.f = 3.14;// 输出浮点数的字节表示printf("浮点数3.14的二进制表示:\n");for (int i = 0; i < 4; i++) {printf("字节%d: 0x%X\n", i, converter.bytes[i]);}return 0;
}

3.通信协议的构造与解析

嵌入式系统中,通信协议(如UART、SPI、I2C等)通常会使用二进制数据包进行传输。共用体可以帮助我们快速解析数据包,或者构造数据包。

#include <stdio.h>// 定义共用体
union Packet {struct {unsigned char header;unsigned char command;unsigned short data;} fields;unsigned char bytes[4]; // 字节形式
};int main() {union Packet packet;// 构造数据包packet.fields.header = 0xAA;  // 标志位packet.fields.command = 0x01; // 命令packet.fields.data = 0x1234;  // 数据// 打印整个数据包的字节printf("构造的数据包:\n");for (int i = 0; i < 4; i++) {printf("字节%d: 0x%X\n", i, packet.bytes[i]);}return 0;
}

输出结果:

构造的数据包:
字节0: 0xAA
字节1: 0x1
字节2: 0x34
字节3: 0x12

 通过共用体,我们可以灵活地访问数据包的各个字段,同时方便地处理其字节形式。

三、嵌入式开发中使用共用体的注意事项

1.成员数据覆盖

共用体的所有成员共享同一块内存,因此在对一个成员赋值后,其他成员的数据会被覆盖。确保在任意时刻只访问一个有效成员。

2.字节对齐问题

嵌入式系统中可能会存在字节对齐问题,使用共用体时需要注意内存布局是否符合硬件的要求。

3.调试复杂性

由于共用体存储的数据可能同时以多种形式存在,调试时需要特别留意数据的解释方式,以免出现误判。

四、总结

共用体是C语言中一个非常实用的工具,尤其在嵌入式开发中,它可以帮助我们:

1.节省宝贵的内存资源;

2.高效地进行数据类型转换;

3.轻松解析和构造通信协议的数据包。

在嵌入式日常学习和项目中,可以多尝试使用共用体优化代码,让自己的程序更加高效和专业!希望本文的分享对你有帮助~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com