Почти каждый сейчас скажет благословение:
производительность !
Хорошо, C позволяет писать спортивный код. Но есть и другие языки, которые могут это сделать, в конце концов! И оптимизирующая мощь современных компиляторов потрясающая. Есть ли у С некоторые преимущества, которых нет у других языков? Или просто нет необходимости в более гибких инструментах в домене?
Ответы:
Это часть этого; детерминированное использование ресурсов важно для устройств с ограниченными ресурсами, но есть и другие причины.
источник
C был разработан для моделирования процессора, потому что C был создан для того, чтобы сделать Unix переносимым между платформами, а не просто писать на ассемблере.
Это означает, что программы на C хорошо работают в качестве языка программирования для программ, которые должны иметь уровень абстракции, очень близкий к фактическому CPU, как в случае со встроенным оборудованием.
Примечание: C был разработан примерно в 1970 году, и тогда процессоры были проще.
источник
Одна из причин доминирования состоит в том, что у него есть правильные инструменты для решения этой задачи. После разработки встраиваемых платформ на Java и C / C ++ я могу вам сказать, что простой подход C ++ более естественен. Спасение разработчика от ощущения, что он или она прыгают через обручи, потому что язык слишком высок, - довольно раздражающая вещь. Хорошим примером является отсутствие в Java переменных без знака.
А удобные функции ВМ / интерпретируемых языков обычно неосуществимы и остаются вне реализации, например, сборка мусора.
источник
Сами по себе требует очень мало поддержки времени выполнения, поэтому издержки намного ниже. Вы не тратите память или хранилище на поддержку времени выполнения, не тратите время / усилия на то, чтобы свести к минимуму эту поддержку, или не должны учитывать это при разработке проекта.
источник
switch
es, ужасны, а те же машины, построенные с иерархиями классов, хороши и удобны в обслуживании.switch
, можно сказать) все еще используется во многих встроенных приложениях. Проще отладить, проще проверить.Как упоминалось в других ответах, C был разработан в начале 1970-х годов для замены языка ассемблера в архитектуре мини-компьютера. Тогда эти компьютеры обычно стоят десятки тысяч долларов, включая память и периферийные устройства.
В настоящее время вы можете получить такую же или более высокую мощность компьютера с 16-разрядным встроенным микроконтроллером, который стоит четыре доллара или меньше в отдельных количествах, включая встроенную память и контроллеры ввода / вывода. 32-битный микроконтроллер стоит, может быть, доллар или два больше.
Когда я программирую этих маленьких ребят, что я и делаю в 90% случаев, когда я не проектирую платы, на которых они сидят, мне нравится визуализировать, что будет делать процессор. Если бы я мог программировать достаточно быстро на ассемблере, я бы сделал это.
Я не хочу всевозможных слоев абстракции. Я часто отлаживаю, просматривая список лжесвидетелей на экране. Это гораздо проще сделать, когда вы написали программу на C для начала.
источник
Он не полностью доминирует, поскольку C ++ все чаще используется, так как улучшаются компиляторы и повышается производительность оборудования. Однако C по-прежнему очень популярен по нескольким причинам;
Широкая поддержка. Практически каждый производитель чипов предоставляет компилятор переменного тока, и любой пример кода и драйверов, вероятно, будет написан на языке c. Компиляторы C ++ все чаще встречаются, но не являются мертвым свидетельством для данного чипа, и они часто бывают ошибочными. Вы также знаете, что любой встроенный инженер сможет работать в ц. Это лингва франка индустрии.
Производительность. Да, ты сказал это. Производительность по-прежнему важна, и в среде, где основные подпрограммы все еще часто пишутся на ассемблере или, по крайней мере, оптимизируются на c со ссылкой на выходные данные сборки, никогда не стоит недооценивать важность этого. Часто встроенные цели будут очень дешевыми и будут иметь очень маленькую память и несколько мипов.
Размер. C ++ имеет тенденцию быть больше. Конечно, все, что использует STL, будет больше. Как правило, с точки зрения размера программы и объема памяти.
Консерватизм. Это очень консервативная индустрия. Отчасти потому, что стоимость отказов часто выше, а отладка часто менее доступна, отчасти потому, что не нужно было менять. Для небольшого встроенного проекта c хорошо справляется со своей задачей.
источник
Для встраиваемых систем большое значение имеет производительность . Но, как вы сказали, почему C, а не какой-то другой язык-исполнитель?
Многие люди до сих пор упоминали о доступности компиляторов , но никто не упоминал о доступности разработчиков . C уже знает больше разработчиков, чем, скажем, OCaml.
Это три большие
источник
Встроенное программное обеспечение очень отличается.
В настольном приложении абстракции и библиотеки экономят ваше время на разработку. Вы можете позволить себе выбросить еще пару мегабайт или гигабайт оперативной памяти или несколько 64-разрядных процессорных ядер 2 + ГГц, и кто-то другой (пользователи) платит за это оборудование. Вы можете не знать, на каких системах будет работать приложение.
Во встроенном проекте ресурсы часто очень ограничены. В одном проекте, над которым я работал (процессоры серии PIC 17X), аппаратное обеспечение имело 2Kwords программной памяти, 8 уровней (аппаратного) стека и 192 байта (<0,2 КБ) оперативной памяти. Разные выводы ввода / вывода имели разные возможности, и вы настраивали оборудование по мере необходимости, записывая данные в регистры оборудования. Отладка включает в себя осциллограф и логический анализатор.
Встраиваемые абстракции часто мешают и будут управлять (и стоить) ресурсами, которых у вас нет. Например, большинство встроенных систем не имеют файловой системы. Микроволновые печи являются встроенными системами. Контроллеры автомобильных двигателей. Некоторые электрические зубные щетки. Некоторые наушники с шумоподавлением.
Для меня очень важным фактором при разработке встроенных систем является знание и контроль того, что код переводит с точки зрения инструкций, ресурсов, памяти и времени выполнения. Часто точная последовательность команд управляет, например, синхронизацией сигналов аппаратного интерфейса.
Абстракции и закулисное «волшебство» (например, сборщик мусора) отлично подходит для настольных приложений. Сборщики мусора сэкономят вам МНОГО времени, чтобы избежать утечек памяти, когда память может / может быть выделена динамически.
Однако в мире встраиваемых систем реального времени нам необходимо знать и контролировать, сколько времени занимает процесс, иногда до наносекунд, и мы не можем выбросить еще пару мегабайт ОЗУ или более быстрый ЦП. Один простой пример: при программном затемнении светодиодов с помощью управления рабочим циклом (центральный процессор контролировал только светодиоды вкл / выкл), процессор не может выключиться и выполнить, например, сборку мусора в течение 100 мс, потому что дисплей будет визуально мигать ярким или погаснуть.
Более гипотетический пример - контроллер двигателя, который напрямую зажигает свечи зажигания. Если этот процессор отключается и выполняет сборку мусора в течение 50 мс, двигатель на мгновение отключится или сработает в неправильном положении коленчатого вала, что может привести к остановке двигателя (при прохождении?) Или механическому повреждению. Вы можете убить кого-то.
источник