eclipse — Как использовать C ++ STD с компилятором AVR?

Я настроил компилятор AVR для использования с микроконтроллером Atmel, используя это руководство.

У меня нет доступа к строкам, векторам и т. Д. Как это можно добавить?

0

Решение

не делайте этого.

использование динамического выделения памяти на avr не рекомендуется, так как он не имеет MMU и только очень ограниченный объем ОЗУ и динамическое выделение памяти требуют некоторых накладных расходов на бухгалтерию.
Также существует опасность фрагментации памяти.

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

2

Другие решения

Быстрый ответ заключается в том, что они недоступны, и вам нужно написать свои собственные классы-оболочки, чтобы получить такую ​​функциональность.

Если вы хотите использовать c ++ для встроенной платформы, у вас не будет доступа ко всей стандартной библиотеке. Важно то, что вы не хочу все стандартные библиотеки, так как она слишком тяжелая для некоторых встроенных проектов. Некоторые языковые функции (например, обработка исключений) могут быть недоступны на выбранной вами платформе или могут быть слишком дорогими из-за доступных вам ресурсов. Отсутствие некоторых языковых функций делает невозможным реализацию определенных стандартных контейнеров, например, контейнеры, которые могут генерировать исключения, могут не быть реализованы в соответствии со стандартами на некоторых платформах. Кроме того, есть некоторые конструкции c ++, которые могут быть доступны, но было бы плохой идеей использовать на встроенной платформе. Динамическое распределение памяти через new а также delete Скорее всего, вы столкнетесь со значительным количеством проблем, так как у вас недостаточно памяти, а с такими проблемами, как фрагментация памяти, очень трудно справиться. (вы, вероятно, захотите посмотреть на размещение новых вместе с другой схемой распределения памяти, чтобы избежать некоторых из этих проблем, если вы необходимый динамическая память почему-то)

Если вы хотите иметь преимущества контейнеров, таких как std::array а также std::string вам нужно будет написать свои собственные классы управления памятью. Одним из основных преимуществ использования std контейнеры — это способ, которым они значительно упрощают управление памятью (по сравнению с использованием необработанных массивов в стиле C). Если вы делаете большой встроенный проект c ++, вы можете написать свои собственные оболочки для управления памятью, используя RAII и другие базовые языковые конструкции c ++. По большей части вам нужно избегать динамического выделения памяти и обработки исключений при создании этих классов.

Одна из вещей, которые я нахожу, имеет хороший ROI — создание структур / классов, которые обертывают массив вместе с длиной массива. Сохраняя размеры подключенными, вы можете сделать код более понятным. Часто я пишу что-то вроде этого:

template<typename T, uint8_t MAX_SIZE>
class array_helper{
public:
typedef T value_type;
array_wrapper():
m_data()
{}

T& operator[](unsigned int idx){
return m_data[idx];
}

T* data(){
return this->m_data;
}

const uint8_t s_max_size = MAX_SIZE;
private:
T m_data[MAX_SIZE];
};

Вы хотели бы расширить это, чтобы сделать то, что вам нужно, но, надеюсь, это дает вам идею.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector