Полностью ли поддерживается C++ STL на Arduino?

c++ stl

У меня пока нет платы Arduino для запуска кода, и, как следует из заголовка, мне интересно, поддерживается ли C++ STL полностью на Arduino и является ли он частью Arduino IDE. STL, вероятно, является наиболее эффективным, полностью протестированным и требующим минимальных ресурсов (что является несколько избыточной фразой, поскольку я уже упоминал эффективность) общедоступным кодом C++, и он значительно облегчит жизнь при программировании для Arduino.

Если STL не является частью Arduino IDE, то как включить определенные библиотеки, такие как <algorithm> и <utility>? (Мне очень хочется спросить «почему она не включена?», но это кажется слишком общим.)

, 👍11


4 ответа


Лучший ответ:

11

STL не является частью Arduino IDE.

Хотя это эффективно по стандартам настольных компьютеров, консенсус в том, что это не помещается комфортно в ограниченном пространстве Arduino. Тем не менее, вот кто-то, кто, кажется, сделал это:

https://github.com/maniacbug/StandardCplusplus

Проверьте вилки, они кажутся более современными

ОБНОВЛЕНИЕ 01 ИЮЛЯ 24 ГОДА

Спустя годы я хотел бы указать на убедительные альтернативы:

  • etl https://github.com/ETLCPP/etl
  • моя собственная estdlib https://github.com/malachi-iot/estdlib
,

2

STL не является частью Arduino и не поддерживает libstc++ от AVR.

Однако мой «ответ» отличается от ответа Малахии в одном месте, как объяснено в комментариях.

Я не думаю, что вам не следует этого делать, просто потому что "большинство людей говорят", что вам не следует этого делать. Есть много людей, которые даже думают, что вам вообще не следует использовать C++. Проблема в том, что C++ (и стандартная библиотека C++) очень мощные и могут быть портированы неэффективным способом.


Зачем использовать libstdc++?

Однако я думаю, что если использовать его с осторожностью, он может быть очень полезен.

Допустим, у нас есть два буфера: буфер отправки и буфер приема. С C вы бы сохранили их в фиксированном массиве символов. В C++ вы можете использовать динамические контейнеры.

Так что в C вы будете использовать 2x 256 байт памяти для сохранения сообщений. Более длинное сообщение не поместится.

В C++ вы будете использовать только те байты, которые необходимы в определенный момент (плюс, вероятно, некоторые дополнительные). А если вы получите более длинное сообщение, оно просто увеличится.

Если C++ вам подходит, и вы его очень-очень хорошо протестировали, почему бы не использовать его? В среднем он будет использовать меньше памяти, так как вы не назначаете ее всю, когда она не используется. У вас возникнут проблемы, когда ваши сообщения станут слишком большими, так как ваша память переполнится, что часто приведет к сбросу микроконтроллера. Но если в вашей программе больше динамических буферов, один может оставить немного места для другого и т. д. Эффективнее используя память!

Но без динамического выделения памяти это может быть немного безопаснее, поскольку вы уже затребовали эти части памяти, нет способа, которым вы не можете их использовать. Любое сообщение большего размера просто не влезет, но вы можете легко это проверить. Другое дело, что C++ stl, которые вы найдете, могут быть не так хорошо оптимизированы для вашей архитектуры/микроконтроллера.

Кроме того, создание собственного динамического хранилища на языке C может вызвать еще больше проблем, чем C++ stl ;). И это не значит, что вам нужно использовать динамическое хранилище для всего, просто иметь возможность это делать уже приятно.


Современные микроконтроллеры также становятся намного серьезнее, например, 8-битные Arduino (328P). За 20 долларов вы можете купить Teensy 3.2 с 256 КБ флэш-памяти, 64 КБ ОЗУ, поэтому в этом случае динамическая память может быть очень полезна (если вы уверены, что у вас всегда достаточно памяти). Также: Все продукты STM32F41xxx содержат: до 192 Кбайт системной SRAM, включая 64 Кбайт ОЗУ данных CCM (core coupled memory)

К тому же, это может быть очень хорошим способом изучить C++ и программировать на том же языке, на котором вы работаете на ПК. Но имейте в виду, что на 8-битном микроконтроллере вам следует проверить, не создают ли ваши stl-функции слишком много накладных расходов.


Как использовать стандартную библиотеку шаблонов C++ для AVR?

Я следил за блогом Энди Брауна и теперь у меня есть итераторы/строки/векторы, работающие в AtmelStudio.

Хотя я и получил некоторые ошибки, первая группа ошибок включала:

Error        '_M_deallocate' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]      D:\avr-stl\include\string    173
Message        declarations in dependent base 'std::_String_alloc_base<char, std::allocator<char>, true>' are not found by unqualified lookup        D:\avr-stl\include\string    173
Message        use 'this->_M_deallocate' instead     D:\avr-stl\include\string    173

Эта ошибка на самом деле объясняет сама себя; вам следует использовать this->_M_deallocate.

После этого я получил неопределенную ссылку на "operator new(unsigned int, void*). Но я исправил это, включив "pnew.cpp" прямо под #include <new> в stl_construct.h, что странно, но работает.

(Фрагмент stl_construct.h)

#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H
#define __SGI_STL_INTERNAL_CONSTRUCT_H

#include <new>
#include <pnew.cpp>

__STL_BEGIN_NAMESPACE
,

3

STL эффективен на платформе, для которой он был разработан, то есть на персональных компьютерах и устройствах аналогичного масштаба, где выделение одного байта в куче занимает страницу памяти размером 4 КБ (это в несколько раз больше, чем ВСЯ оперативная память Arduino), и где индексы массивов можно эффективно заменить указателями (8-битным микроконтроллерам требуется не менее двух команд для работы с указателем). Так что нет, он неэффективен с Arduino.

Подумайте об алгоритме быстрой сортировки — он очень хорошо работает на больших списках, но его легко превзойдет простая сортировка, если вам нужно отсортировать массив из 5 элементов. Быть асимптотически эффективным не означает быть эффективным в каждом случае.

,

3

STL не является частью Arduino IDE.

Другой ответ — упоминание https://github.com/maniacbug/StandardCplusplus, хотя эта библиотека, похоже, больше не поддерживается.

Возможно, лучшей идеей будет попробовать https://github.com/mike-matera/ArduinoSTL

Это порт uClibc++, упакованный как библиотека Arduino.

,