nanopb одно из требований к размеру - PullRequest
1 голос
/ 22 мая 2019

Я наткнулся на 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 Ответ

1 голос
/ 22 мая 2019

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

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

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

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

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

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