nanopb 尺寸要求

nanopb oneof size requirements

我遇到了 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 个字符,那么联合总是 50 个字节长,即使我需要 4 个字节用于浮点数。

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

谢谢!

你的理解是正确的,C中的结构大小将等于oneof的最大成员的大小。然而这只是内存中的大小,序列化后的消息大小将是内容所需的最小值。

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

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

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

在整个系统设计中,所需最大大小的静态分配通常是最容易测试的。如果数据适合一次,它将永远适合。如果您选择动态分配,则需要更仔细地分析所需的最大可能内存使用量。