Вопрос

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

Это было полезно?

Решение

На этот вопрос не так-то просто ответить.Это зависит от ряда факторов, в том числе:

  • Как вы предпочитаете размещать свой код.
  • Доступен ли компилятор C++ для вашей цели (и любых других целей, на которых вы, возможно, захотите использовать загрузчик).
  • Насколько важен размер кода для вашего приложения (возможно, мы говорим о дополнительных 10%, а не в МБ, как предлагается в другом ответе).

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

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

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

Хорошее обсуждение многих необоснованных причин, по которым люди отвергают C++, см. Статья Дэна Сакса на Embedded.com.

Другие советы

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

Если вам не нужно использовать объектную ориентацию, используйте C. Простой выбор там. Это проще и проще, одновременно выполняя ту же задачу.

Некоторые харды не согласятся, но OO - это то, что делает C ++ > С и наоборот во многих обстоятельствах.

Я бы использовал C, если нет особой причины использовать C ++. Для Bootloader вам на самом деле не понадобится OO.

Используйте самый простой инструмент, который выполнит эту работу.

Написание программ на C - это не то же самое, что написание на C ++. Если вы знаете, как это сделать только в C ++, тогда ваш выбор - C ++. Для написания загрузчика будет лучше минимизировать код, поэтому вам, вероятно, придется отключить стандартную библиотеку C ++. Если вы знаете, как писать на C, вам следует использовать C & # 8212; это более распространенный выбор для такого рода задач.

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

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

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

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

Использование OO все еще может работать хорошо, если вы избегаете использования виртуальных функций. Избегайте неизменных типов объектов, которые требуют большого копирования для передачи значений, таких как std :: string. Но вы все равно можете использовать такие функции, как шаблоны, без какого-либо реального влияния на производительность во время выполнения.

Используйте C с & # 181; Clibc . Это сделает ваш код проще и уменьшит его площадь. Вы можете найти по адресу: www.uclibc.org .

Для такой конкретной задачи, как загрузчик, я бы определенно не использовал C ++. Я думаю, что стандартная библиотека c ++ занимает по крайней мере пару МБ, а не то, что вам нужно в загрузчике. Перейти с C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top