【问题标题】:C dynamic sized IO packages in embeded systems嵌入式系统中的 C 动态大小 UP 包
【发布时间】:2021-08-04 18:37:22
【问题描述】:

总的来说,我想知道如何使用动态大小的包来实现 IO 接口(即 NFC 通信堆栈)。我最近不得不实现这样一个 NFC 堆栈,它(NFC-Dep)使用“I-Block”消息。它们具有以下结构:

Name: PCB DID Payload CRC
Length: 1 byte 1 byte 0 to 251 byte 2 byte

我有一些想法,例如:

struct iblock{
    uint8_t PCB;
    uint8_t DID;
    const void *payload;
    size_t payload_size;
    uint8_t CRC[2];
};

然后我可以从缓冲区中读取标头的值,但必须引用有效负载的缓冲区。如果我不能使用动态内存,有没有更好的方法来做到这一点。或者做这种事情的普遍接受的方式是什么?

非常感谢您的回复和建议。

【问题讨论】:

  • 什么是PCBDID?我希望其中一个包含有效负载大小。
  • 由于有效载荷最多为 251 字节,您可以使用 uint8_t payload[251]; 来避免动态内存。
  • NFC 使用不同的格式。它被称为 NDEF。您的格式必须包含有效负载大小信息。

标签: c io embedded nfc


【解决方案1】:

uint8_t package [256]; 是唯一的便携式解决方案。使用大小变量来跟踪实际使用了多少缓冲区和/或有效负载。是的,只有静态分配内存才有意义,因为您的程序必须支持最大有效负载的最坏情况。所以你不能通过不时分配一点内存来“节省内存”。 (此外,堆实际上并没有在单核 MCU 系统上节省内存,因为这不是它们的实现方式。)

由于对齐和填充,结构存在问题。特别是,您的代码在 32 位目标上无法正常工作。如果您坚持使用结构,那么您可能必须编写序列化/反序列化例程,从原始缓冲区填充结构。

另外你为什么要 const 限定有效载荷?这可能没有任何意义,因为您必须反复用数据填充它。

【讨论】:

  • 就像 Lundin 提到的那样,我还建议对您的数据进行序列化。您可以使用诸如 Protobuf(NanoPB 或 EmbeddedProto)之类的东西来存储您的数据。通过使用 protobuf,您可以绕过对齐/填充问题,并使您的代码向后兼容。 EmbeddedProto 作为在 NFC 标签上存储数据的简化示例:embeddedproto.com/nfc-example-with-embedded-proto
猜你喜欢
  • 2012-07-26
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多