Сколько байтов вы можете хранить внутри строки Arduino? - PullRequest
0 голосов
/ 25 марта 2019

Я искал в WWW, сколько мы можем хранить внутри Arduino String string; или внутри String v[0];.Но даже Arduino Reference page не имеет ответа.Каждый поиск заканчивается тем, что кто-то говорит, что вы не должны использовать String (заглавная S) на Arduino, потому что у него недостаточно памяти для обработки большой, плохой String.Я не использую Arduino Uno, поэтому я не возражаю, если String использует больше памяти, чем std :: string.

У вас есть какие-нибудь идеи, какую максимальную длину может хранить объект String?

1 Ответ

0 голосов
/ 26 марта 2019

Максимальная длина строки зависит от того, сколько памяти свободно, когда вы пытаетесь что-то в ней сохранить.

Программное обеспечение, лежащее в основе Arduino Core, поддерживает область оперативной памяти, называемую «кучей», которую программное обеспечение можетвыделить из во время выполнения.String вызывает функцию с именем realloc() (стандартная функция библиотеки C, которая помогает управлять кучей), когда ей необходимо увеличить объем памяти, используемой для его строки.

https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/WString.cpp#L170

Максимальный размер String может быть намного меньше, чем количество свободной кучи.В зависимости от того, как ваше программное обеспечение распределяет и освобождает память, куча может иметь много маленьких кусков памяти, доступных с выделенной памятью между ними («фрагментация кучи»).Таким образом, самая большая свободная часть может быть намного меньше, чем общая сумма свободной кучи.

Вот почему люди советуют не использовать String.Он часто выделяет память, особенно если вы изменяете объекты String, и может легко привести к фрагментации кучи, так что вы не сможете выделить большой кусок памяти.Этот эффект хуже на процессорах с небольшим объемом памяти, таких как Arduinos.ESP8266 немного лучше, так как у него больше памяти.ESP32 намного лучше, потому что у него гораздо больше памяти.

Это усугубляется тем фактом, что String завершается неудачно, когда он не может выделить память.В этом случае ваша программа просто будет работать без предупреждения.

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

ESP32 Arduino Core имеет несколько функций, которые могут помочь, если вы пытаетесь понять, насколько большойString Вы можете иметь:

  • ESP.getHeapSize() возвращает общий размер кучи, включая выделенную и свободную память.Это будет больше, чем потенциальный максимум String, который вы можете сделать.
  • ESP.getFreeHeap() возвращает общее свободное пространство в куче.Это также будет больше, чем потенциальный максимум String, который вы можете сделать.
  • ESP.getMaxAllocHeap() возвращает размер наибольшего фрагмента кучи, который вы можете выделить.Это будет приблизительно самое большое String, которое вы можете выделить.Может быть намного меньше чем ESP.getFreeHeap().
...