
✅ **Решение
1️⃣ Статическое выделение памяти. Память выделяется во время компиляции и используется на всю длительность программы.
2️⃣ Пулы памяти. Это предварительно выделенные блоки памяти, разделённые на фрагменты фиксированного размера. Этот подход позволяет минимизировать фрагментацию и накладные расходы.
3️⃣ Используйте динамическое выделение памяти только на этапе инициализации. Объём динамически выделяемой памяти может быть постоянным или зависеть от статических входных данных, таких как перемычки конфигурации. Наличие достаточного объёма памяти можно относительно легко проверить. Даже если система обнаружит нехватку памяти во время работы, ошибка возникнет на этапе инициализации, поэтому её можно обработать так же, как и сбой самотестирования при включении.
4️⃣ **Выделяйте память, но никогда не освобождайте её. **Это решает проблему управления мусором, если объекты никогда не нужно освобождать после выделения. Их можно выделять из списка свободных объектов, если он не пуст, и возвращать туда же. Это легко применять в C++, реализовав операторы new и delete для соответствующих классов.
Такая стратегия решает и проблему достаточности при условии, что можно установить верхний предел количества выделяемых объектов. Тогда общее требование к памяти в куче будет просто суммой общих требований для каждого типа объектов. Фрагментации не возникнет, поскольку память никогда не освобождается. Время выделения памяти легко обеспечить, используя простой распределитель, который работает за постоянное время.
📍 Я часто применяю в проектах реализацию из FreeRTOS, обернутую в аллокатор, совместимый с классами STL. Ведь STL всё же гораздо лучше ETL.
#IT #embedded #кейсы