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

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

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

Что относительно Java в этом домене?

Спасибо.

16
задан EmbeddedProg 18 May 2010 в 09:19
поделиться

8 ответов

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

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

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

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

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

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

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

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

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

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

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

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

27
ответ дан 30 November 2019 в 15:21
поделиться

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

9
ответ дан 30 November 2019 в 15:21
поделиться

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

3
ответ дан 30 November 2019 в 15:21
поделиться

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

  • переключатели: ассемблер
  • маршрутизатороподобные устройства: C и / или C ++
  • карманные компьютеры: Java или QT / C ++
  • полные системы: комбинации C и / или C ++ с python
9
ответ дан 30 November 2019 в 15:21
поделиться

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

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

2
ответ дан 30 November 2019 в 15:21
поделиться

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

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

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

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

An Embedded Software Primer

2
ответ дан 30 November 2019 в 15:21
поделиться

Или C ++ подходит только в том случае, если некоторые особенности языка (например, RTTI, исключения и шаблоны) исключены?

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

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

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

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

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

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


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

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

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

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

6
ответ дан 30 November 2019 в 15:21
поделиться

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

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

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

1
ответ дан 30 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: