打印
[STM32F1]

实际应用示例:协议栈

[复制链接]
741|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
米多0036|  楼主 | 2024-6-12 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
考虑一个简单的协议栈,其中数据包有不同的类型和结构,但它们共用相同的内存区域:

c

typedef enum {
    TYPE_A,
    TYPE_B,
    TYPE_C
} PacketType;

typedef struct {
    uint16_t length;
    PacketType type;
    union {
        struct {
            uint8_t fieldA1;
            uint16_t fieldA2;
        } typeA;
        struct {
            uint16_t fieldB1;
            uint8_t fieldB2[10];
        } typeB;
        struct {
            uint32_t fieldC1;
        } typeC;
    } data;
} Packet;

void processPacket(Packet* pkt) {
    switch (pkt->type) {
        case TYPE_A:
            // Process typeA packet
            break;
        case TYPE_B:
            // Process typeB packet
            break;
        case TYPE_C:
            // Process typeC packet
            break;
    }
}
在这个示例中,根据数据包的类型,Packet 结构体中共用的数据部分会以不同的格式存储。这种方式确保了不同类型数据包可以在相同的内存空间中存储,从而减少整体内存使用。

注意事项
数据一致性:由于 union 中的所有成员共享相同的内存区域,确保在读取一个成员之前已经正确地写入了该成员类型的数据。

类型转换和对齐:在某些平台上,不同数据类型可能有不同的对齐要求,使用 union 时需要注意对齐问题。

调试困难:由于 union 使用同一内存区域存储不同类型的数据,调试时可能会遇到困难,尤其是在数据损坏或意外覆盖时。

通过合理使用 union,可以显著减少变量的内存占用,提高嵌入式系统的内存利用效率。然而,需要仔细设计和调试代码以确保数据的一致性和正确性。



使用特权

评论回复
沙发
EmmaTT| | 2024-6-18 22:25 | 只看该作者
共用体确实能解决些很方便的问题啊

使用特权

评论回复
板凳
丢丢手绢666| | 2024-6-30 16:21 | 只看该作者
根据数据包的类型,Packet 结构体中共用的数据部分会以不同的格式存储

使用特权

评论回复
地板
雨果喝水| | 2024-8-29 12:58 | 只看该作者
定义了数据包的三种类型 (TYPE_A, TYPE_B, TYPE_C)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

128

主题

1392

帖子

0

粉丝