STL во встроенной системе с очень ограниченным объемом памяти

В настоящее время я занимаюсь созданием встроенной системы с использованием процессора ARM Cortex M3 с 64 КБ SRAM. На данный момент я ищу способ обеспечить детерминированную производительность с помощью контейнеров STL, что включает в себя гарантию того, что у меня не может закончиться нехватка памяти во время выполнения.

Меня прежде всего интересует, как контейнеры STL выполняют динамическое выделение памяти. Хотя я могу использовать специальный распределитель, чтобы эти структуры получали память из пула, который я выделил, мне нужно было бы настроить отдельный пул для каждой структуры, чтобы гарантировать, что один экземпляр структуры не может занимать пространство другого экземпляра.

Над этим проектом я работаю с другими людьми, которые не хотят заниматься необработанным распределением памяти и предпочитают использовать «хорошо известные» структуры данных (стек, очередь, очередь и т. д.). Поэтому в настоящее время я рассматриваю возможность создания оболочек вокруг C-массивов для предоставления этих структур. Это обеспечит статическое выделение памяти, необходимой для поддержки этих контейнеров, и позволит другим разработчикам узнать размер контейнера, который они создали до начала выполнения, на основе информации о размере кода, предоставленной компилятором. На мой взгляд, это гарантирует, что проблемы с нехваткой памяти не возникнут во время выполнения, и значительно упрощает проектирование системы.

Другой вариант предполагает выделение контейнеров STL при инициализации системы. После периода инициализации дополнительное выделение динамической памяти не могло произойти. Однако, насколько мне известно, стандартные структуры данных C++ STL не поддерживают это - для этого потребуется, чтобы контейнеры, такие как стек, могли быть предварительно распределены (аналогично вектору).

Буду признателен за любые комментарии относительно моего предложения строить классы на основе стандартных C-массивов? Кроме того, есть ли более простой способ выделения контейнера STL статического размера, такого как стек или очередь статического размера, во время компиляции? (Я знаю, что это возможно с вектором, но с другими я не уверен)

Примечание: я прочитал другой вопрос ( Embedded C++ использовать STL или нет), но автор этот вопрос не дал понять, сколько у них памяти (кроме того, как они использовали процесс ARM7) или, похоже, рассматривали решение, подобное моему.

Второе примечание: я знаю, что некоторым разработчикам 64 КБ SRAM может показаться большим объемом памяти. На самом деле я занимался разработкой на процессорах AVR со значительно меньшим объемом памяти, так что я понимаю эту перспективу. Однако, с моей текущей (возможно, неосведомленной) точки зрения, 64 КБ памяти — это немного, когда речь идет о контейнерах STL.

12
задан Community 23 May 2017 в 12:08
поделиться