尺寸要求之一

时间:2019-05-22 13:12:16

标签: protocol-buffers nanopb

我遇到了nanopb,想在我的项目中使用它。我正在为嵌入式设备编写代码,因此内存限制是一个真正的问题。

我的目标是在设备之间传输数据项,每个数据项都有一个32位的标识符和一个值。该值可以是从1个字符到浮点数到长字符串的任何值。我想知道对于这种类型的问题,声明消息的最有效方法是什么。

我在想这样的事情:

message data_msg{
    message data_item{
        int32 id = 1;
        oneof value{
            int8  ival = 2;
            float fval = 3;
            string sval = 4;
        }
    }
  repeated data_item;
}

但是据我了解,这会转换为C并集,即最大元素的大小。假设我将字符串限制为50个字符,那么即使我需要4个字节的浮点数,联合也总是50个字节长。

我是否正确理解了这一点,或者还有其他方法可以做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的理解是正确的,C中的结构大小将等于其中一个的最大成员的大小。但是,这只是内存中的大小,序列化后的消息大小将是内容所需的最小值。

如果内存大小有问题,则有几个选项可用。默认情况下分配最大可能需要的大小使内存管理变得容易。如果只想动态分配所需的内存量,则必须决定如何做:

  1. 使用PB_ENABLE_MALLOC编译选项,可以将FT_POINTER字段类型用于字符串和其他大字段。然后将使用malloc()从系统堆中分配内存。

  2. 使用FT_CALLBACK,而不是分配任何内存,您将得到一个回调,您可以在其中读出字符串并以任何所需的方式处理或存储它。例如,如果您想将字符串写入SD卡,则无需将其完全存储在内存中即可。

在整个系统设计中,通常最容易测试所需最大大小的静态分配。如果数据适合一次,它将始终适合。如果要进行动态分配,则需要更仔细地分析所需的最大内存使用量是什么。