Подтвердить что ты не робот

Используйте правильный инструмент для задания: встроенное программирование

Мне интересны языки программирования, хорошо подходящие для встроенного программирования. В частности:

Возможно ли программировать встроенные системы в С++? Или лучше использовать чистый C? Или С++ OK, только если некоторые функции языка (например, RTTI, исключения и шаблоны) исключены?

Как насчет Java в этом домене?

Спасибо.

4b9b3361

Ответ 1

Можно ли программировать встроенные систем в С++?

Да, конечно, даже на 8-битных системах. С++ имеет несколько иные требования к инициализации во время выполнения, чем C, поскольку перед вызовом main() создаются конструкторы для любых статических объектов. Накладные расходы (не включая сами конструкторы, которые находятся под вашим контролем) для этого крошечные, хотя вы должны быть осторожны, так как порядок построения не определен.

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

Или лучше использовать чистый C?

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

Или С++ OK, только если некоторые особенности языка (например, RTTI, исключения и шаблоны) исключены?

Функции языка, которые могут быть приемлемыми, полностью зависят от цели и приложения. Если вы ограничены в памяти, вы можете избежать дорогостоящих функций или библиотек, и даже тогда это может зависеть от того, является ли это кодом или пространством данных, на котором вам не хватает (по целям, где они являются отдельными). Если приложение жесткое реальное время, вы бы избежали тех функций и классов библиотек, которые не детерминированы.

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

Если вы решите использовать С++, убедитесь, что у вас есть приличное оборудование/программное обеспечение отладчика, которое известно на С++. Относительная легкость, с которой сложное программное обеспечение может быть построено на С++, делает достойный отладчик еще более ценным. Не все инструменты на встроенной арене - это С++, которые знают или способны.

Я всегда рекомендую копать в архивах Embedded.com по любому встроенному предмету, у него есть множество статей, в том числе ряд просто этот вопрос, в том числе:

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

[edit] Я просто получил это в информационном бюллетене TechOnline: Использование С++ эффективно во встроенных приложениях

Ответ 2

Чаще всего во встроенных системах язык, на котором вы программируете, определяется тем, какой компилятор действительно доступен.
Если у вас аппаратное обеспечение есть только компилятор C, это то, что вы собираетесь использовать. ЕСЛИ он имеет достойный компилятор С++, чем нет причин предпочитать C над С++.
Я бы посмел сказать, что Java не очень популярный выбор во встроенных системах.

Ответ 3

Встроенное программирование в наши дни охватывает широкий спектр приложений.
Грубо говоря, он идет от датчиков/переключателей до полных систем безопасности.
Вы должны основывать свой язык на сложности и аппаратных ресурсах.
Это один из вариантов рядом с HW (CPU,...), OS, протоколами,...
возможные варианты:

  • : ассемблер
  • устройства с маршрутизатором: C и/или С++
  • карманные компьютеры: Java или QT/С++
  • полные системы: комбинации C и/или С++ с python

Ответ 4

Или С++ OK, только если некоторые функции языка (например, RTTI, исключения и шаблоны) исключены?

Хорошо думать об этом. Сложность компиляции - это не большая проблема, но сложность выполнения имеет стоимость ресурсов.

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

Я бы не исключил шаблоны. Они сложны в том, чтобы думать, и вам нужен компилятор, который хорошо их обрабатывает, но стоимость ресурса - это почти все время компиляции - что будет стоить вам, так это то, что каждый раз, когда вы используете шаблон с разными параметрами класса, вы создаете новый набор кода для создания экземпляров функций-членов. Но вам почти наверняка придется делать то же самое без шаблонов. Кроме того, шаблоны позволяют создавать и тестировать библиотеки для общих обстоятельств, в отдельных файлах, которые создаются во время компиляции, а не времени ссылки. Просто уточнить, что: шаблоны позволяют вам иметь файл A.h, который вы тестируете. Затем вы используете его с файлом B.h или B.c для его экземпляра во время компиляции. (Библиотека будет связана, а не скомпилирована, и это делает ее менее гибкой - методы шаблонов могут быть оптимизированы, поэтому они не будут выполнять вызов функции.) Я использовал шаблоны во встроенных системах для реализации кода CRC и исправления, point math: я могу проверить общий код, поместить его в управление версиями, а затем повторно использовать его несколько раз, написав простой класс, который происходит из шаблона или имеет поле члена шаблона. Классическим примером, конечно же, является STL.

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

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

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


edit: Я бы хотел использовать Java вместо С++ во встроенном мире. К сожалению, мои варианты ограничены, а затраты ресурсов времени выполнения (размер кода, размер памяти, ограничения времени сбора мусора) слишком высоки в пространстве, в котором я работаю. Моя причина для использования Java меньше из-за его свойств времени выполнения и больше для факт, что его дизайн программного обеспечения намного чище, а инструменты намного лучше (OMG! рефакторинг! woohoo!)... ключ ко мне, похоже, лежит на двух вещах, которые делают C/С++ очень неудобными в сравнении:

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

  • разделение интерфейса/реализации в Java не является этой неуклюжей уродливой .c/.h файловым делением, что делает компиляторы такими медленными. В constrast я использую Java в Eclipse, и он автоматически компилирует код, когда я его редактирую. Это огромно! Я нахожу большинство своих ошибок сразу. В C/С++ мне приходится ждать целого цикла компиляции.

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

Ответ 5

Оба C и С++ могут использоваться во встроенных системах. Если вы ограничиваете возможности С++, которые вы используете, тогда он будет использовать примерно ту же скорость и пространство, что и C. Что касается использования этих дополнительных функций, это действительно зависит от ваших ограничений. Например, если вы создаете систему в режиме реального времени, исключения могут быть не очень хорошей идеей, просто потому, что, учитывая время распространения для исключений и все пути, через которые могут распространяться исключения, могут сделать жесткие гарантии в реальном времени довольно жесткими ( хотя, опять же, реализация CORBA в режиме реального времени ACE/Tao использует исключения). Хотя шаблоны и RTTI могут привести к более крупным программам, во встроенных системах много изменчивости, и поэтому в зависимости от ваших ограничений ресурсов это может быть совершенно нормально или неприемлемо. То же самое касается Java. Java (ну, технически, язык программирования Java с подмножеством Java API) работает на Android, например, используя VM Dalvik. J2ME работает на различных встроенных устройствах. Будет ли он работать или не будет работать для вашего приложения, зависит от ваших конкретных ограничений.

Ответ 6

c - наиболее распространенный язык, используемый во встроенных системах.

Однако, я думаю, что будущее С++ лежит во встроенном системном домене. Я думаю, что стандарты С++ 0x помогут в этом переосмыслении. Поэтому я не удивлюсь, увидев, что С++ использует намного больше в этой области.

Ответ 7

Я думаю, что у вас уже есть отличный ответ Клиффорда, но я добавлю свой опыт. Как уже указывалось, основным элементом является встроенная система. В Defense/Aerospace C и Ada - самые популярные встроенные языки, с которыми я сталкиваюсь. Хотя со временем я вижу больше С++, поскольку основанная на модели разработка становится популярной среди таких инструментов, как Rhapsody. В списке вакансий видение требований к объектно-ориентированному дизайну также заставляет меня думать, что рынок медленно переключается, чтобы следить за тенденциями основного развития.

Если вы действительно заинтересованы в встроенной разработке, я бы начал с C. Это довольно универсально. Почти каждая ОС, включая операционную систему, такую ​​как Integrity, Nucleus, VxWorks и встроенный Linux, имеет для нее компилятор и инструменты. То, что вы узнаете о указателях, управлении памятью и т.д., Будет, по крайней мере, хорошо переведено на С++ во встроенном мире.

Что касается Java, если вы заинтересованы в разработке мобильных платформ, таких как смартфоны, это хороший выбор (Android приходит на ум). Но в мире операционных систем реального времени я этого не видел.

В этой заметке это приводит меня к моему последнему пункту и советам. Если бы я хотел перейти в встроенное программирование (что я сделал всего 4 года назад), я бы сосредоточился на изучении C с точки зрения низкого уровня, как упомянуто выше. Затем я также узнал, что делает программирование в реальном времени таким сложным/разным. Я нашел книгу, которая достаточно хороша, чтобы научить вас думать как встроенный программист против разработчика приложений. Удачи!

Встроенный программный файл

Ответ 8

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

Конечно, возможно использовать С++ во встроенном пространстве, но полный набор функций языка требует много работы для правильного порта. Например, eCos реализуется в смеси C и что вы можете назвать структурными аспектами С++; поддержка RTTI, исключения и STL отсутствуют в бесплатной версии, хотя есть люди, работающие над этим (и доступный коммерческий порт).

Аналогично, можно использовать Java - я знаю, я портировал JVM во встроенную среду; это было не забавно - хотя обычно вы получаете сокращенную конфигурацию языка Java, часто что-то основанное на J2ME.