В настоящее время мы перепроектируем наше встроенное программное обеспечение и переходим от 8-битных к 32-битным Cortex-M микроконтроллерам. Память довольно ограничена (128 Кбайт Flash и 32 Кбайт ОЗУ). В another thread была рекомендована встроенная библиотека программного обеспечения (www.redblocks.de). По-видимому, он очень хорошо удовлетворяет мои потребности, но требует использования C++. Есть ли у кого-нибудь опыт работы с C++ на встроенных платформах, таких как наши? Мне интересно, с какими накладными расходами я занимаюсь, по сравнению с C.Является ли C++ подходящим для крошечных встроенных целей?
ответ
В зависимости от C++ функции, которые вы используете, там практически нет накладных расходов по сравнению с С.
Вот некоторые особенности по сравнению:
- Использование классов без виртуальных методов результатов в том же двоичном коде как функции C, работающие над структурой данных, которая передается как указатель
- Когда используются классы с виртуальными методами, в раздел данных объекта добавляется vptr и vtable, представленный в сегменте текстовой памяти. Аналогичная функциональность может быть реализована на C с указателями функций (которые также занимают память). Как только у вас есть несколько виртуальных методов в классе, вы обычно получаете более эффективный двоичный код при использовании C++ вместо того, чтобы вручную вводить несколько указателей на каждый объект с помощью C.
- Эффективность обработки исключений отличается от компилятора к компилятор.
- RTTI добавляет накладные расходы и не должен использоваться на крошечных встроенных объектах.
- Непрерывное использование динамической памяти (malloc/free в C и new/delete на C++) следует избегать с обоими языками программирования на платформах без управления виртуальной памятью.
- Шаблоны имеют много общего с макросами препроцессора C, поскольку они оцениваются во время компиляции и являются своего рода генерацией кода исходного кода. Таким образом, они не добавляют накладные расходы во время выполнения. Однако использование их неназванно приведет к раздутому коду. Если они используются в правильных местах, они могут даже помочь сократить накладные расходы во время выполнения.
Я думаю, что наиболее сложной проблемой является знание разработчиков. C++, особенно при многократном использовании шаблонов, является гораздо более сложным языком, чем C. Поэтому вам нужна куча хороших разработчиков.
Однако, если вы хотите пойти на чистый и многоразовые объектно-ориентированном проектировании, C++, безусловно, лучший выбор, чем C.
Спасибо за отличный ответ. –
Рейнхард: Да, это отличный ответ. Вы должны щелкнуть галочкой рядом с этим ответом, чтобы выбрать его в качестве принятого ответа, чтобы помочь @Mats увеличить его рейтинг репутации. – sifferman
Я сам не встроенный разработчик, но у меня есть несколько коллег, использующих C++ для типа микроконтроллеров, на которые вы нацеливаете.
Язык сам по себе не содержит много накладных расходов, но использование стандартной библиотеки (контейнеры, алгоритмы ...) не рекомендуется, если вы ограничены во Flash/RAM.
Если у вас возникли проблемы, вы также можете избежать RTTI и исключения.
Дополнительная информация о this paper или по телефону this page.
Книга Effective C++ in an Embedded Environment Форма Скотт Мейерс также является очень хорошим источником информации.
К сожалению, это, кажется, слишком широким и на основе мнений, для этого сайта.Вы можете отредактировать вопрос (или задать новый) с более узким вопросом или с какой-либо конкретной проблемой, с которой вы сталкиваетесь или ожидаете столкнуться. – Petr
До сих пор я запрограммировал все mcs на Cortex на C++ и не сталкивался с какими-либо проблемами. Однако в зависимости от того, как вы управляете своей кучей, вы, возможно, не сможете использовать контейнеры STL или, по крайней мере, потребовать собственный распределитель. – MikeMB