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 union, который является размером самого большого элемента. Скажем, я ограничиваю строку 50-ю символами, тогда объединение всегда имеет длину 50 байт, даже если мне нужно 4 байта для числа с плавающей запятой.

Правильно ли я понял это или есть другой способ сделать это?

Спасибо!

1 ответ

Решение

Ваше понимание верно, размер структуры в C будет равен размеру наибольшего члена oneof. Однако это только размер в памяти, размер сообщения после сериализации будет минимально необходимым для содержимого.

Если размер в памяти является проблемой, есть несколько доступных вариантов. Значение по умолчанию для выделения максимально возможного необходимого размера упрощает управление памятью. Если вы хотите динамически распределять только необходимый объем памяти, вам нужно решить, как вы хотите это сделать:

  1. С помощью PB_ENABLE_MALLOC вариант компиляции, вы можете использовать FT_POINTER тип поля для строки и других больших полей. Затем память будет выделена с использованием malloc() из системной кучи.

  2. С FT_CALLBACKвместо того, чтобы выделять какую-либо память, вы получите обратный вызов, в котором вы сможете прочитать строку и обработать или сохранить ее любым удобным для вас способом. Например, если вы хотите записать строку на SD-карту, вы можете сделать это, даже не сохранив ее полностью в памяти.

В общем дизайне системы статическое распределение для максимального требуемого размера часто проще всего проверить. Если данные подходят один раз, они всегда будут соответствовать. Если вы идете на динамическое распределение, вам нужно будет более тщательно проанализировать, какое максимальное использование памяти требуется.

Другие вопросы по тегам