Использование C ++ во встроенной среде - PullRequest
6 голосов
/ 19 мая 2009

Сегодня я вступил в очень интересную беседу с коллегой, о которой одна тема заставила меня задуматься и погуглить этим вечером. Использование C ++ (в отличие от C) во встроенной среде. Оглядываясь вокруг, можно найти хорошие сделки за и против функций, предоставляемых C ++, но другие Meyers явно поддерживают это. Итак, мне было интересно, кто сможет пролить свет на эту тему и каково общее согласие сообщества.

Ответы [ 11 ]

6 голосов
/ 19 мая 2009

Страх C ++ среди разработчиков встраиваемых систем остался в прошлом, когда компиляторы C ++ были не так хороши, как компиляторы C (оптимизация и качество кода).

Это особенно относится к современным платформам с 32-битной архитектурой. Но C, безусловно, по-прежнему является предпочтительным выбором для более ограниченных сред (как ассемблер для 8-битных или 4-битных целей).

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

В настоящее время многие современные встраиваемые платформы (например, игровые приставки, мобильные телефоны, КПК и т. Д.) Действительно стали очень способными объектами с архитектурой RISC, несколькими МБ ОЗУ и аппаратным ускорением 3D.

Было бы плохим решением программировать такие платформы, используя только C или даже ассемблер, из-за неосведомленных соображений производительности, с другой стороны, программирование 16-битной PIC на C ++, вероятно, также было бы спорным решением.

Итак, на самом деле нужно спросить себя, сколько сил вам действительно понадобится и сколько вы можете позволить себе пожертвовать, чтобы улучшить опыт разработки (язык высокого уровня, быстрая разработка, менее утомительный / избыточные задачи).

6 голосов
/ 19 мая 2009

C ++ для встраиваемых платформ - это прекрасно, если вы относитесь к нему как к лучшему C. Мне нравится тот факт, что язык немного более структурирован. Вы все еще можете делать все то, что вы хотите сделать с C. Просто не забудьте придерживаться встроенной библиотеки C, такой как Newlib или uClibc.

Мне особенно нравится абстракция, которую мы можем построить с использованием C ++, особенно для устройств ввода-вывода. Таким образом, у нас может быть класс для UART и класс для GPIO, и тому подобное. Это чище, чем иметь кучу функций (ИМХО).

5 голосов
/ 19 мая 2009

Это зависит от конкретной природы вашей встроенной системы и от того, какие функции C ++ вы используете. Сам язык не обязательно генерирует более объемный код, чем C.

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

Я обнаружил, что шаблоны - это самая важная вещь, которую следует избегать, когда память действительно ограничена, поскольку вы получаете по одной копии каждой функции шаблона для каждого типа, для которого она специализирована, и это может быстро увеличить объем кода.

В индустрии консольных видеоигр (которая является своеобразным концом встроенного мира) C ++ - король. Нашими ограничениями являются жесткие ограничения на объем памяти (512 МБ для текущего поколения) и производительность в реальном времени. Обычно используются виртуальные функции и шаблоны, но не исключения, так как они раздувают стек и слишком дороги. Фактически, компилятор одного крупного производителя даже не поддерживает исключения.

2 голосов
/ 19 мая 2009

В моей предыдущей компании весь встроенный код был написан в небольшом подмножестве кода C по соображениям безопасности (SIL-2) и памяти. Внедрение более богатого языка, такого как C ++, в этом конкретном сценарии может вызвать больше проблем, чем преимуществ.

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

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

1 голос
/ 19 мая 2009

Теперь через несколько дней все сводится к поддержке платформы C ++ во время выполнения. Скорее всего, вы найдете способ скомпилировать код C ++ практически для любой встроенной платформы с GCC, но если вы не можете найти подходящее время выполнения C ++ для платформы, ваши усилия будут тщетными, если вы не напишите свою собственную среду выполнения C ++.

1 голос
/ 19 мая 2009

Зависит от того, какую встроенную разработку вы делаете. Я занимался разработкой встраиваемых систем с использованием C ++, C и Assembly на различных платформах. Вы даже можете использовать Java для написания приложений на смартфонах.

Например, на смартфоне, таком как устройство, работающем под управлением Windows CE 5, почти весь код написан на C ++, в том числе в операционной системе. В C или сборке записываются только маленькие биты.

С другой стороны, я написал код для микроконтроллера MSP430, который был на C, и я, вероятно, сделал бы это на C ++, если бы компилятор был более надежным и соответствовал стандартам.

Также, похоже, я вспоминаю одного преподавателя университета, который говорил о написании встроенного кода на Forth или что-то в этом роде. Так что на самом деле любой язык может сделать.

1 голос
/ 19 мая 2009

Я не знаю об «общем консенсусе», только в компании, в которой я работаю (которая занимается разработкой мобильных телефонов, автомобильных навигационных систем, DPF и т. Д.).

Главный недостаток, с которым я столкнулся при использовании C ++ на встроенных платформах, в отличие от C, заключается в том, что он не настолько переносим - есть еще много случаев, когда компиляторы не придерживаются стандарта, что может вызвать проблемы, если вам нужно собрать свой код с более чем одним компилятором или иметь ошибки в реализации. Кроме того, существуют среды, в которых код C ++ просто не запускается - проблемы BREW с перемещаемым кодом и его «собственным ООП» не так хорошо работают с «обычными» классами C ++ и наследованием.

Однако, в конце концов, если вы ориентируетесь только на одну платформу, я бы сказал, что используйте все, что вы считаете «лучше» (быстрее, меньше ошибок, лучший дизайн) для вашей разработки - в большинстве случаев проблемы могут быть работал довольно легко.

0 голосов
/ 23 октября 2015

C ++ подходит для микроконтроллеров и устройств без ОС. Вам просто нужно знать архитектуру системы и осознавать временные и пространственные ограничения, особенно при выполнении критически важных программ.

С C ++ вы можете делать абстракцию, которая часто приводит к увеличению занимаемой площади в коде. Вы не хотите этого при программировании для компьютера с ограниченными ресурсами, такого как 8-битный MCU.

Как правило, избегайте:

  • Динамическое распределение памяти, потому что оно представляет неопределенность во времени
  • 1010 * Перегрузка *
  • RTTI, поскольку стоимость памяти велика
  • Исключения из-за снижения скорости выполнения

Будьте осторожны с виртуальными функциями, поскольку они имеют стоимость ресурсов виртуальной таблицы на класс и один указатель на виртуальную таблицу на объект. Также используйте const вместо # define.

При перемещении до 16- и 32-разрядных MCU с 10 или 100 МБ ОЗУ могут использоваться более тяжелые функции, подобные упомянутым выше.

Итак, C ++ полезен для встраиваемых систем. Основным преимуществом является то, что ООП может быть полезным, если вы хотите абстрагировать аспекты микроконтроллера, например UART или конечные автоматы. Но вы можете все время избегать определенных функций и некоторых функций в зависимости от цели, для которой вы программируете.

0 голосов
/ 02 июня 2009

В настоящее время у меня проблема с исключениями во встроенном приложении Linux. Мы пытаемся портировать программное обеспечение, написанное для другой платформы, которая, кажется, хорошо поддерживает исключения, но новые инструменты компилятора (порт gcc) сообщают об ошибках при создании eh_frame. Я был против использования исключений для этого инструмента, но разработчик заверил меня, что современные компиляторы хорошо его поддержат.

Мое мнение таково, что у C ++ есть некоторые преимущества, но я бы держался подальше от исключений и стандартной библиотеки шаблонов. У нас не было проблем с использованием виртуальных функций.

0 голосов
/ 19 мая 2009

Важной вещью, которая долго удерживала нас от использования C ++, была его поддержка VxWorks, которая по-настоящему ужасна. Предположительно, это улучшилось на VxWorks 6 (да, это было давно ... хорошая блокировка поставщика и отсутствие видения компании удерживали нас в VxWorks 5.5).

Так что для нас это в основном вопрос окружающей среды. После этого C ++, очевидно, может быть таким же хорошим, как и C ... это вопрос людей, понимающих, что делает их инструмент и как его использовать. C ++ может облегчить написание невероятно неэффективного кода, но это не значит, что мы должны его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...