В течение всего прошлого года по данным NASDAQ во всём мире было произведено около 10 миллиардов процессоров. Не более 5% из них попали в компьютеры и серверы общего назначения. Остальные стали сердцем embedded систем. Эти цифры однозначно говорят — мы напрочь забываем о том, что традиционная в нашем понимании индустрия информационных технологий — это лишь островок в океане. В океане, в котором, оказывается, кипит очень бурная жизнь.

Мир так несправедливо устроен, что герой только тогда герой, когда все про него знают. История не только пишется победителями, она ещё пишется теми, кто умеет собственно писать. Причём привлечь внимание современного человека к чему-либо интересному, но без бросающихся в глаза наклеек, становится всё сложнее — мы предпочитаем информационный фаст-фуд, яркие картинки, глянец, гламур…

В индустрии информационных технологий всё так же — все знают про тех и про то, что на слуху: Google, Ruby, Java, Windows, Linux. Мало кто задумывается о том, что область информационных технологий значительно шире, чем мы привыкли думать. Самый яркий пример, иллюстрирующий эту мысль: большая часть рынка процессоров и львиная доля рынка ПО приходится на долю embedded software&systems. И об этом очень мало кто знает — это при том, что наша жизнь немыслима без встроенных устройств. Даже вот этот текст
немыслим — смотрите сами.

Автор набирает этот текст на клавиатуре (embedded-устройство номер раз) компьютера, который загружается только благодаря… нет, не только Windows, а как минимум трём программам, управляющим железом на низком уровне — BIOS материнской платы, firmware HDD и BIOS видеокарты. Автор смотрит на этот текст на экране монитора, в котором тоже есть встроенная система. Потом текст прочитает редактор и корректор (тоже на компьютерах с мониторами), потом его сверстает верстальщик и т.д.

Все вышеперечисленные устройства содержат микропроцессоры или как минимум микроконтроллеры, которые являются хоть и весьма технологически сложным, но всё же всего лишь набором «железа». Для того чтобы «оживить» его, нужно программное обеспечение, разработка которого является совсем не тривиальной задачей. Честно говоря, за понятием embedded-системы скрывается индустрия, которая по размерам превосходит, пожалуй, любую другую. А её влияние на нашу жизнь таково, что исчезни она завтра — и мы окажемся беспомощнее новорожденных котят.

Прежде чем мы начнём копать вглубь, коротко перечислим только некоторые устройства, которые являются embedded и содержат процессоры: светофоры, часы, марсоходы, игровые приставки, смартфоны, «программируемые» клавиатуры и мыши, mp3-проигрыватели, проекторы, микроволновые печи, автомобильная электроника, кондиционеры… В общем, практически всё, во что можно ткнуть пальцем (хоть это и не вежливо) и сказать — «это электроника».
Важно понимать, что системы реального времени не имеют ничего общего с высокой производительностью — подавляющее большинство суперкомпьютеров не управляются ОС реального времени, и в то же время вычислительной мощности чипа в модуле ABS автомобиля едва ли хватит для запуска Windows.
Что до точного определения embedded-системы, то как такового его не существует. Сколько источников, столько и мнений, общее у всех определений лишь одно — встроенная система, это что-то, что содержитпроцессор или программируемый микроконтроллер и оптимизировано под выполнение конкретной задачи.

А дальше идут разночтения. Есть, например, мнение, что узкоспециализированные, но массовые устройства под управлением полноценной операционной системы — это уже не встроенные устройства, а фактически компьютеры общего назначения. Но мы оставим этот «религиозный» спор.

Добавим лишь, что размер системы тоже не является решающим фактором — встроенные системы могут быть размером в несколько миллиметров с 4-х битным процессором и 4 KB памяти или же мощным вычислительным кластером с десятками современных процессоров и терабайтами памяти. И управлять они могут с равным успехом и будильником, и группой промышленных роботов.

Си? Си, си, сеньор!

В ходе работы над этой статьёй автор много читал. А ещё он общался со специалистами компании Accenture, которая так же занимается embedded-проектами. Так вот, помимо всего прочего автор прочитал статью Майкла Барра, бывшего главного редактора авторитетного отраслевого журнала Embedded Systems Design, а также автора десятков публикаций и трёх книг на тему встроенных систем. В статье «Real men program in C» для Embedded.com он сетовал на то, что современные американские студенты технических вузов не только не знают такой язык программирования, как С, но и не хотят его знать, считая его чем-то вроде компьютерной латыни. Дескать, классика, но никому не нужная.

Ситуация усугубляется тем, что в ведущих американских и европейских вузах нет такой специальности, как Embedded Systems, и профессора не уделяют теме достаточно внимания, считая её не особо популярной. Наш собеседник в Accenture, по долгу службы постоянно работающий со студентами, готов подписаться под словами Майкла Барра, но уже применительно к латвийской действительности. Латвийские студенты тоже не знают и не хотят знать С, считая, что Java им пригодится больше. Их, впрочем, можно понять — латвийская индустрия в подавляющем большинстве своём нацелена не на разработку уникальных систем и уж тем более не на программирование на низком уровне, а на создание веб-приложений для государства. Учебные программы латвийских технических вузов тоже не особенно способствуют расширению кругозора студентов в области разработки embedded-систем и применения С, а уж тем более Ассемблера

А между тем C является «королём» рынка embedded-систем. Вот, например, (см. график ниже) каковы результаты ежегодного опроса, который в течение 13 лет проводил авторитетный журнал Embedded Systems Design.


Как мы видим, C доминирует над С++ и Ассемблером, а все прочие языки вместе взятые не набирают и 10%. Разрыв между 2004 и 2005 годами был необходим, так как изменилась методика — до 2005 года респондентам задавали вопрос «Какие языки программирования вы использовали для вашей embedded-системы в течение последних 12 месяцев?» и позволяли множественный выбор. Начиная с 2005 года вопрос звучал уже иначе: «Мой текущий embedded-проект в основном пишется на ____?». И выбор теперь только одиночный.

На графике хорошо видно, как С постоянно «отъедает» долю С++ и Ассемблера. И это происходит на протяжении 13 лет подряд с небольшим взлётом популярности С++ в 2001 году. Так что хоронить этот язык программирования, мягко говоря, преждевременно. Если сопоставить данные NASDAQ о проданных процессорах и доле рынка С, то получится, что в прошлом году около 6 млрд новых чипов работали под управлением систем, написанных на этом языке
программирования. Подсчёт грубоват, конечно, зато цифра красивая. При этом мы не говорим, что не используется ничего, кроме С.

В embedded-проектах также применяются обычные настольные операционные системы и вполне современное «железо», в паре допускающие использование в том числе и объектно-ориентированных языков программирования, например, таких как Java. Взять хотя бы те же банкоматы или автоматы на бензоколонках — в большинстве случаев в их основе лежат обыкновенные компьютеры под управлением вполне «гражданских» Windows 2000 и XP. И для них
вполне можно программировать хоть на Visual Basic. Однако в общей массе embedded-систем доля обычных компьютеров невелика, а значит, разработчики чаще всего имеют дело со специализированным железом и специфическими требованиями.

Что мы хотим подчеркнуть особо — С далёк от статуса «мёртвого» языка. Множество людей каждый день успешно пишут программное обеспечение на этом языке. Все благодаря его гибкости, эффективности и элегантности. Не зря все международные олимпиады по информатики фактически требуют либо С, либо С++.

Особые потребности

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

Самое главное отличие в программировании для PC и для встроенной системы заключается в том, что в последнем случае разработчик как правило ограничен в использовании ресурсов системы. И ограничен весьма сильно — Intel Core i7 в калькуляторах почему-то не используют.

Причина такого подхода проста и сугубо прозаична — встроенные устройства часто выпускаются миллионами, а то и десятками миллионов штук. При таких объёмах экономия даже в 5 USD за счёт использования менее мощного процессора оборачивается десятками и сотнями миллионов сэкономленных средств, либо серьёзным снижением цены, что важно для конечного потребителя. Так что как правило для embedded-устройств используют железо, которого едваедва хватает для нормальной работы.

Это делается ещё часто и из-за жёстких требований к энергопотреблению — менее мощные чипы потребляют, естественно, меньше.

Часто бывает так, что встроенная система почти или полностью лишена оперативной памяти — и, что называется, крутись как хочешь. Либо, что встречается гораздо чаще — количество памяти абсолютно минимально. Понятно, что при таких условиях из железа приходится выжимать все соки, и «низкоуровневые» языки типа Ассембелера или С являются лучшими инструментами для решения этой задачи. Ну а когда речь идёт о крупных проектах с большой командой разработчиков, то применяют C++.

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

Чем ещё специфична разработка для embedded-систем, так это уровнем ответственности, причём смотреть В каком-то смысле embedded-системой можно считать даже легендарный Colossus, который применялся криптоаналитиками Bletchley Park в 1944 году в процессе взлома кодов немецкой «Энигмы». А что — это узкоспециализированное электронное устройство, имеем право называть его встроенным! Однако первое узкоспециализированное программируемое электронное устройство появилось несколько позже — в 1946 году, машина под названием Eniac. Оно занимало не одну комнату, и 18 тысяч вакуумных трубок потребляли тонны электроэнергии.

В начале 50-х годов прошлого столетия компьютерные технологии начали развиваться гораздо интенсивнее. Для начала изобрели Ассемблер. В 1952 году Грейс Хоппер (тот самый, что нашёл первый баг) написал первый в компьютерной истории компилятор — для языка программирования A-0. А с 1954 по 1957 Джон Бакус со своей командой в IBM занимался созданием первого «абстрактного» языка программирования и компилятора для него — FORTRAN (FORmula TRANslation). Через год в MIT родился на свет ещё один легендарный язык — LISP.

В 1960 создали COBOL, который, кстати, стал первым в истории мультиплатформенным языком программирования.

В 1965 году DEC представила первый в мире компьютер, который можно с полным правом называть «встроенным» — 12 bit машина под названием PDP-8 была мировым бестселлером до 1973 года и широко применялась в разных коммерческих системах. Даром что это была махина размером с бабушкин шкаф. Да и стоила она весьма внушительные 18 тыс. USD (порядка 120 тыс. «сегодня» ). В этом же году Гордон Мур «придумал» Закон Мура.

В 1967 Никлас Врит начал работы над PASCAL. Закончит от в 1971-м, когда большинства из тех, кто учил этот язык в школе, ещё и на свете-то не было. В 1968 году RCA придумала первый CMOS-чип CD4000, который сразу же «списали» в low-end и встраиваемые системы — он был слишком медленным для «больших» машин. В этом же году Fairchild придумала операционный усилитель номер 741, который стал самым популярным устройством этого класса за всю историю. Его широко применяли во встроенных системах — ветераны рыдают от умиления.

В 1970 году Intel придумала первый DRAM-чип (dynamic random-access memory) — 1103. Годом спустя Signetics представила таймер 555, опять же легенду мира встроенной техники. В этом же 1971 году начинается новейшая история embedded-мира — Intel начинает производство 4 bit чипа 4004, а также 1101 — 256 bit программируемой памяти, а заодно и 1701 — 256 bit памяти типа EROM (erasable read-only memory). Это важно, так как до того момента данные из «статичной» памяти встроенных устройств нельзя было удалять.

В 1978 родилась архитектура x86, а в 1979 — язык С++. Через год Hunter&Ready представила первую в мире коммерческую embedded-ОС — VRTX (Versatile Real-Time Executive). Годом спустя, в 1981, в Стэндфорде начались разработки того, что потом станет чипом MIPS. В 1984 Borland представила Turbo Pascal, перевернувший представление о программировании у многих тогдашних студентов. В том же году Фуджио Масуока из Toshiba придумал flash-память — сегодняшнюю основу очень многих (практически всех) встроенных систем.

В 1987 году Borland представила первую версию Turbo C для IBM PC. Исследователи верят в то, что именно этот релиз сделал С по настоящему популярным и языком де-факто для embedded-систем. В 1990 году IEEE одобрила стандарт JTAG для дебагинга встроенных систем. Через год в мир IT пришёл чёрный пингвин с жёлтыми лапами — Linux.

В 1993 году придумали архитектуру PowerPC — весьма популярную в мире встроенных систем (такой чип и в вашей PlayStation 3 живёт, кстати). В 1996 году Microsoft вышла на рынок встроенных систем с Windows CE.


Обратите внимание на левую нижнюю кнопку в левой части р уля — выг лядит знакомо? Жаль, чт о
Линус Торвальдс не дог адался сдела ть ст оль же у ниверсальным пинвигна — выг лядело бы забавнее.


На этот уровень посмотреть можно с нескольких сторон. Во-первых, встроенные системы очень часто применяются в таких исключительно важных с точки зрения безопасности жизни и здоровья людей приборах, как медицинское оборудование, центры управления ядерными реакторами, высокоточное оружие. Ошибка или сбой в любой из таких систем может стоить жизни людям. А потому и ответственность разработчика выше (Да что там АЭС — ошибка в такой банальной вещи, как модуль ABS в автомобиле, тоже может стоить людям жизни!).

Во-вторых, встроенные системы, в отличие от программ для настольного компьютера или серверов, часто бывает невозможно исправить после отправки продукта «за ворота». Можно выпустить патч для Windows 7 и даже обновление для BIOS материнской платы, но невозможно пропатчить будильник, монитор или марсоход.

Таким образом разработчик должен понимать — что он напишет, то люди и получат. И то, что они получат, будет работать годами, а то и десятилетиями. Или не работать.

Следующее требование — автономность работы и автоматическое восстановление работоспособностисистемы после серьёзной ошибки.

Встроенная система часто лишена канала связи с разработчиком, контакт с ней со стороны обслуживающего персонала может отсутствовать или быть нерегулярным. Поэтому очень важно, чтобы embedded-программа могла самостоятельно обработать ошибку и, если надо, принять решение о, например, перезагрузке самой себя. Впрочем, есть сферы, где перезагрузка даже в течение 500 ms считается недопустимо долгой (никто не обрадуется, если система жизнеобеспечения в реанимации решит уйти в ребут). Это требование автономности часто вообще незнакомо традиционным программистам. И оно, безусловно, накладывает свой отпечаток на разработчиков embedded-систем.

Наконец, последнее, что отличает профессионального разработчика низкоуровневых систем — это понимание принципов работы электронного оборудования. Когда код пишется для устройства, для которого не существует эмулуятора и программного отладчика, приходится использовать осциллограф, применять диагностическое оборудование, поддерживающее интерфейсы JTAG или NEXUS. Впрочем, это экстремальные случаи — для процессоров, которые широко применяются в embedded-проектах, как пра-вило созданы специальные дебагеры, которые «общаются» с устройством через распространённый интерфейс; эмуляторы процессоров; эмуляторы всей аппаратной платформы. Но в любом случае разработчик должен знать хотя бы основы электротехники.

Вас ждут в операционной…

До сих пор, рассказывая о встроенных системах, мы особо не заостряли внимание на том, под какими операционными системами работают встроенные устройства. Иногда, если мы говорим про холодильник или будильник, ОС нет вовсе. Но если говорить о более серьёзных вещах, то на первый план выходит Linux.

В принципе, Linux оказалась в нужном месте в нужное время, и на этом рынке она определённо оттеснила Windows. Ещё 15 лет назад рынок операционных систем для встроенных систем был крайне фрагментирован — не было лидера и в разных индустриях использовали свои решения, в массе своей коммерческие. Но в начале столетия начался (и он продолжается) бурный рост рынка встроенных систем, и ему потребовалась операционная система, знакомая большому количеству разработчиков, ранее с миром Embedded не связанных.

И этой ОС оказалась Linux. Её козырем стало также то, что она родственна Unix и с открытом исходным кодом — бесценные качества для мира embedded-систем. Выше мы уже говорили о том, какую колоссальную экономию в масштабах даже одной партии устройств можно получить, «сбросив» всего лишь несколько долларов. Возможность брать операционную систему бесплатно, то есть даром, играет далеко не последнюю роль в столь важном процессе экономии.

При этом Linux тогда была весьма скромной и «лёгкой» операционной системой («была», потому что недавно сам Линус Торвальдс признал, что она в последние годы несколько «обрюзгла») с очень высокой надёжностью. Фактически это то, что надо для успешного embedded-проекта.

Существуют разные исследования на тему того, сколько именно процентов рынка занимает Linux. Всех их объединяет одно — признание того, что эта операционная система является доминирующей. Linux, несмотря на все старания, не удалось захватить рынок рабочих станций, и даже на серверном рынке ей дают бой старички, но в embedded-сфере победа однозначна — сегодня пингвин контролирует не менее 50% рынка. А некоторые отводят ему долю вплоть до 65%.

Естественно, что те десятки операционных систем, что присутствовали на рынке до Linux, подвинулись, но не исчезли. Крупнейшими из ныне здравствующих являются, разумеется, Windows CE, DOS, eCore, VxWorks (патриарх!) и разные разновидности Unix. Linux едва ли станет безусловным монополистом, хотя бы потому, что есть устройства, которые требуют операционные системы реального времени. Linux хоть и стремится таковой быть, но на самом деле ею не является. ОС реального времени широко (насколько это вообще применимо в данном случае) используют в управлении атомными реакторами, промышленными роботами, в автомобилях и на производстве — везде, где требуется уверенность в том, что система при любом раскладе среагирует на заданное событие за заранее оговоренное время. Недопустимо, если рабочий потеряет руку из-за того, что промышленный пресс отреагирует на её появление в рабочей зоне не за 40 ms, а на порядок позже и случится это из-за «системного события», которое ему пришлось обработать. А о последствиях «задумчивости» АЭС мы и вовсе помолчим.

Кстати, забавно, но с очень, очень большим скрипом Linux приняли военные. Причём не только и не столько в силу якобы свойственного им консерватизма (что в корне неверно, кстати — тысячи и тысячи технологий пришли в мирную жизнь «по конверсии»), сколько из-за особенности лицензий, сопровождающих открытое программное обеспечение. Вероятно, им не особо хотелось делиться своими наработками с комьюнити — по понятным, наверное, причинам.

Заключение

Как это мы частенько любим делать, заключение мы хотим посвятить юношам, обдумывающим житьё. Embedded-системы появились задолго до появления персональных компьютеров и, очевидно, их переживут — с каждым годом их становится только больше. И мало того, что специалисты в этой области востребованы даже в Латвии, а значит, на хлеб с маслом себе заработать можно будет всегда, так это может быть и крайне интересной сферой для приложения своих талантов. Всего-то надо — интересоваться Linux, не бояться С и, конечно же, подружиться с электроникой хотя бы на начальном уровне