我遇到了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个字节长。
我是否正确理解了这一点,或者还有其他方法可以做到这一点?
谢谢!
答案 0 :(得分:1)
您的理解是正确的,C中的结构大小将等于其中一个的最大成员的大小。但是,这只是内存中的大小,序列化后的消息大小将是内容所需的最小值。
如果内存大小有问题,则有几个选项可用。默认情况下分配最大可能需要的大小使内存管理变得容易。如果只想动态分配所需的内存量,则必须决定如何做:
使用PB_ENABLE_MALLOC
编译选项,可以将FT_POINTER
字段类型用于字符串和其他大字段。然后将使用malloc()
从系统堆中分配内存。
使用FT_CALLBACK
,而不是分配任何内存,您将得到一个回调,您可以在其中读出字符串并以任何所需的方式处理或存储它。例如,如果您想将字符串写入SD卡,则无需将其完全存储在内存中即可。
在整个系统设计中,通常最容易测试所需最大大小的静态分配。如果数据适合一次,它将始终适合。如果要进行动态分配,则需要更仔细地分析所需的最大内存使用量是什么。