Как я должен управлять памятью в своем встраиваемом приложении в жестком реальном времени?
Я нашел некоторые статьи с Google, но не мог точно определить действительно полезное практическое руководство.
DO-178b
запрещает динамические выделения памяти, но как Вы будете управлять памятью затем? Предварительно выделите все заранее и отправьте указатель на каждую функцию, для которой нужно выделение? Выделить его на стеке? Используйте глобальное статическое средство выделения (но затем это очень похоже на динамическое выделение)?
Ответы могут иметь форму обычного ответа, ссылки на ресурс или ссылки на хорошую встроенную систему с открытым исходным кодом, например.
разъяснение: проблема здесь не, является ли управление памятью availible для встроенной системы. А что такое хороший дизайн для встроенной системы, для максимизации надежности.
Я не понимаю, почему статически предварительное выделение пула буферов, и динамично получение и отбрасывание его, отличаются от динамичного выделения памяти.
Как человек, который имел дело со встроенными системами, хотя пока и не так строго (я читал DO-178B, однако):
Правда, я думаю, что ваши ответы можно найти, присоединившись к http://www.do178site.com/
Долгосрочные критически важные системы реального времени не должны динамически выделять и освобождать память из кучи. Если вам нужен и вы не можете его создать, напишите свою собственную схему управления выделенным и фиксированным пулом. Да, по возможности выделяется фиксированное заранее. Все остальное требует возможных проблем.
Отказ от ответственности: я не работал специально с DO-178b, но я написал программное обеспечение для сертифицированных систем.
В сертифицированных системах, разработчиком которых я был, ...
Это оставило нам следующие варианты ...
Наша компания обнаружила, что объединение структур с последующим получением / выпуском из / обратно в пул было наиболее полезным. Мы смогли придерживаться модели и сохранить детерминированность с минимальными проблемами.
Надеюсь, что это поможет.
Выделение всего из стека обычно делается во встроенных системах или в других местах, где возможность неудачного выделения неприемлема. Я не знаю, что такое DO-178b, но если проблема в том, что malloc недоступен на вашей платформе, вы также можете реализовать его самостоятельно (реализовав свою собственную кучу), но это все равно может привести к сбою выделения, когда у вас закончится место, конечно.
Вы также можете найти этот вопрос интересным, динамическое распределение часто запрещено в настройках с ограниченным пространством (на самом деле, основная память там все еще полезна).
Обычно, когда функция malloc () недоступна, я просто использую стек. Как сказал Tronic , вся причина отказа от использования malloc () заключается в том, что он может дать сбой. Если вы используете глобальный статический пул, вполне вероятно, что ваша внутренняя реализация malloc () может быть защищена от сбоев.
Это действительно, очень, очень зависит от поставленной задачи и от того, что будет выставлено на доске.
Невозможно быть уверенным на 100%.
Вы можете посмотреть примеры распределителей памяти FreeRTOS. Те, если не ошибаюсь, используют статический пул.
Я работал в среде DO-178B (системы для самолетов). Насколько я понял, основная причина, по которой не разрешается динамическое распределение, заключается в основном в сертификации. Сертификация проводится с помощью тестов (унитарных, покрывающих, интеграционных, ...). С помощью этих тестов вы должны доказать, что поведение вашей программы на 100% предсказуемо, почти до такой степени, что объем памяти вашего процесса одинаков от одного выполнения к другому. Поскольку динамическое распределение выполняется на куче (и может быть неудачным), вы не можете легко доказать это (я представляю, что это должно быть возможно, если вы владеете всеми инструментами, от аппаратного обеспечения до любого написанного куска кода, но ...). У вас нет такой проблемы со статическим распределением. Именно поэтому C++ в то время не использовался в таких средах. (это было около 15 лет назад, возможно, ситуация изменилась...)
Практически, вы должны написать много пулов структур и функций распределения, которые гарантируют, что у вас есть что-то детерминированное. Можно придумать множество решений. Ключевым является то, что вы должны доказать (с помощью ТОННЫ тестов) высокий уровень детерминированного поведения. Легче доказать, что ваша ручная разработка работает детерминированно, чем доказать, что linux + gcc детерминированно выделяет память.
Просто мои 2 цента. Это было давно, все могло измениться, но что касается сертификации типа DO-178B, смысл в том, чтобы доказать, что ваше приложение будет работать одинаково в любое время в любом контексте.