Оглавление
Первые компьютеры занимали целые помещения, весили несколько тонн и потребляли неизмеримое количество электроэнергии. Считается одним из первых компьютеров ENIAC, который занимал площадь 140 м2, весил 27 тонн и потреблял 140 кВт. Он был построен из 18000 электронных ламп и вследствии огромной стоимости ЭВМ этого типа годились лишь для выполнения специализированных вычислений.

Тогда ещё никто не думал об использовании компьютеров для управления устройствами. Системы управления были реализованы с помощью простой логики, построенной на реле и других электромеханических элементах. Первый прорыв произошел в 1948 году с изобретением транзистора, положившего начало процессу миниатюризации и постепенному удешевлению компьютерных схем. В том же году было начато серийное производство аналоговых компьютеров. Еще одним важным шагом стала разработка первых интегральных микросхем в начале 1960-х годов, что явилось очередным шагом в миниатюризации и было связано со снижением стоимости и энергопотребления. Именно тогда появилась первая идея использования компьютера для управления устройствами или другими объектами. Как обычно сначала в военной и космической отрасли.
Одной из первых встраиваемых систем, в современном понимании этого слова, считается компьютер, использовавшийся в программе «Аполлон», собранный в 1966 году. Он использовался для управления лунным модулем. Компьютер работал на частоте 2 МГц, имел 15-битное машинное слово с одним битом четности, 2048 машинных слов ОЗУ и 36884 слова ПЗУ. Весил 32 кг и для его питания требовался источник мощностью 55 Вт. Вычислительная мощность была аналогична 8-битному микропроцессору 65c02 1981 года. Но первой компьютерной системой, использовавшейся в массовом масштабе, был компьютер D17-B для управления межконтинентальными баллистическими ракетами Minutman I. Он был на дискретных компонентах и содержал более 1500 транзисторов и 6000 диодов.

Естественно они были очень дорогими, и их могли себе позволить только военные и госучреждения. Дальнейшее снижение стоимости и миниатюризация произошли с разработкой первого 4-битного микропроцессора 4004, за которым последовал массовый 8-битный микропроцессор 8080. Для правильной работы ему требовалась внешняя оперативная память, ПЗУ и около десятка других дополнительных микросхем, таких как генераторы тактовых сигналов, счетчиков времени или микросхемы ввода-вывода. Эти были на порядок дешевле, чем упомянутые ранее небольшие компьютеры на интегральных микросхемах, но все еще относительно дорогими и использовались только в более совершенных устройствах. Разработка более дешевого микропроцессора 65c02 мало изменила дело, так как для правильной работы вычислительной системы по-прежнему требовались дополнительные внешние цепи.

Настоящий прорыв произошел в 1976 году с разработкой микросхемы 8048, объединившей в одном чипе полную систему: процессор, 1 кБ ПЗУ, 64 байта ОЗУ, схему таймера, счетчика и внешние порты GPIO. Интеграция компьютера в одну систему значительно удешевила его, и со временем выяснилось, что построить устройство на базе микроконтроллера заметно дешевле.
Для правильной работы микроконтроллеру требовалось всего несколько внешних компонентов. Кроме того, оказалось, что с ростом вычислительной эффективности система управления с микроконтроллером может выполнять ряд более сложных функций.
Определение встраиваемой системы
Что же такое с формальной точки зрения встроенная система? Это специализированная компьютерная система, которая является неотъемлемой частью поддерживаемого ею оборудования и используется для управления другими объектами. Сегодня сложно представить современную электронную технику, как бытовую, так и профессиональную, без возможности свободного выбора параметров, настройки и взаимодействия с пользователем. Это возможно благодаря использованию микропроцессоров, управляющих работой этих устройств.
Встраиваемые системы встречаются во многих местах, например в электронных часах, мобильных телефонах, телевизорах, плеерах, бытовой технике, автомобилях, интеллектуальных зданиях, измерительных приборах и автоматике. Сейчас сложно найти даже самое простое устройство, построенное без использования микропроцессора. Эту тенденцию отчетливо видно по радиолюбительским конструкциям, а устройства, реализованные только с использованием дискретных компонентов, — стало редкостью.
Характеристики, которые делают компьютерную систему встроенной системой, а не компьютерной системой общего назначения, следующие:
- Управление осуществляется путем размещения внутри устройства (объекта) определенного компьютерного комплекса, постоянно подключенного к данному объекту, оснащенного специальным программным обеспечением, выполняющим определенные функции.
- Компьютерная система отвечает определенным требованиям, определенным для задач, которые она должна выполнять.
- Основана на микропроцессоре (или микроконтроллере), запрограммированном на выполнение ограниченного числа задач или даже только одной.
- В зависимости от сложности выполняемых задач может содержать программное обеспечение, предназначенное исключительно для данного устройства, или может представлять собой универсальную операционную систему с установленным специальным программным обеспечением.
Основным признаком, отличающим встроенные системы от других компьютерных систем, помимо их специализированного характера, является качество программного обеспечения и используемых компонентов компьютерной системы.
Общее правило: чем проще программное обеспечение и чем оно более специализировано, тем надежнее система и позволяет быстрее реагировать на критические события. Надежность системы можно повысить за счет разделения задач на более мелкие подсистемы, а также за счет резервирования. Может заключаться в использовании для одной задачи двух одинаковых устройств, второе из которых берет на себя задачи первого в случае выхода из строя одного из них. Это особенно важно в случае систем отвечающих за надзорные функции, связанные с жизнью и безопасностью (например, авиация, медицина).
Встраиваемые системы можно разделить на две категории. Первая определяет функциональные требования, вторая учитывает требуемую вычислительную мощность. Низкопроизводительные системы выполняют простые действия и в настоящее время строятся с использованием 8-битных микроконтроллеров, например, из семейства PIC — AVR, или простейших 32-битных микроконтроллеров с ядром Cortex-M0/M0+, например STM32L0/F0. Конструкция платы обычно включает в себя несколько внешних элементов, а программное обеспечение работает независимо от операционной системы. Системы этого типа могут быть построены из простых масштаба БИС (крупномасштабная интеграция, БИС — большие масштабы интеграции), но из-за гораздо меньшей стоимости и большей функциональности их выпускают в виде встраиваемой системы. Пользовательский интерфейс несложный и обычно состоит из нескольких кнопок и буквенно-цифрового или 7-сегментного светодиодного дисплея. В простейших случаях информация о состоянии отображается с помощью светодиодов.

Операционные системы средней производительности чаще всего реализуются с использованием одного 32-битного микроконтроллера, например, с ядром MIPS (PIC32) или ARM Cortex-M3/M4/M7 (STM32 / LPC4xxx) или даже простого DSP процессора. Печатная плата относительно сложна и может содержать множество дополнительных элементов, но не содержит внешней флэш или оперативной памяти. Программное обеспечение также более обширно и обычно включает в себя операционную систему реального времени и дополнительные библиотеки для сложных задач, таких как: поддержка протокола TCP/IP, поддержка стека USB или поддержка графического интерфейса. Пользовательский интерфейс может быть довольно сложным и обширным, с графическим дисплеем и сенсорной панелью.
Большие встраиваемые системы могут состоять из нескольких процессоров, включая DSP, программируемые микросхемы или сложные SoC, оснащенные 64-битными многоядерными процессорами. Печатные платы в системах такого типа очень сложны, поскольку основная память, внешняя FLASH-память и другие компоненты, работающие на высокой частоте, требуют использования многоразрядных высокоскоростных шин.
Программное обеспечение, в котором процессор чаще всего работает под Linux, также является продвинутым. Другие процессоры могут работать под управлением систем реального времени, выполняя критичные ко времени задачи. Системы этого типа обычно имеют большие сенсорные экраны или внешние мониторы, подключаемые напеример через порт HDMI.
Важным критерием разделения встраиваемых систем выступает функциональность. Предъявляют разные требования к системам управления освещением, где время реакции имеет мало значения, и совершенно другие требования к системам управления промышленными роботами, где необходимо использовать систему реального времени. Выделим такие группы:
Автономные встроенные системы — компьютерные системы, способные работать независимо, без необходимости взаимодействия с другими устройствами, например с главным компьютером. Они собирают данные с аналоговых или цифровых входов, выполняют вычисления и преобразуют результаты операций в состояния соответствующих аналоговых или цифровых выходов. Примеры таких встраиваемых систем: контроллер стиральной машины, видеокамера, термостат холодильника.
Сетевые системы — характеризуются тем, что имеют возможность связываться с другими объектами, например, посредством компьютерных сетей LAN, модема GSM, модема Wi-Fi. Примерами таких систем являются интеллектуальные строительные установки или веб-камеры.
Мобильные системы — портативные системы, особое внимание уделяется портативности и минимизации энергопотребления из-за того что они в основном используют питание от аккумуляторов. Типичными представителями таких систем являются: мобильные телефоны, MP3-плееры, фотоаппараты.
Операционные системы реального времени — характеризуются реакцией в строго определенном временном режиме. Системы этого типа должны реагировать на заданный ввод в течение строго определенного времени, так как отсутствие ответа может привести к некорректной работе и даже повреждению объекта, управляемого системой. Такие контроллеры чаще всего изготавливаются с использованием микроконтроллера или микропроцессора без блока управления памятью (MMU), потому что виртуальная память не гарантирует детерминированную временную характеристику системы. Для защиты памяти (при необходимости) используется MPU (Memory Protection Unit), что позволяет устанавливать диапазоны защиты областей физической памяти, без виртуального адресного пространства.
Представленные категории могут перекрываться, например, встроенная система реального времени может быть и сетью, и мобильной системой одновременно.
Аппаратное обеспечение во встроенных системах
Во встраиваемых системах чаще всего используется оборудование на базе однокристальных микроконтроллеров или микропроцессоров SoC (System on Chip), тогда как встраиваемые системы обычно небольшие (например, мыши, клавиатуры, контроллеры кондиционера и другие) из-за цены и небольшого размера использования микроконтроллеры однокристальные. Более сложные средние и большие системы могут использовать микропроцессорные SoC. Наиболее продвинутые системы могут включать в себя несколько микроконтроллеров, SoC и программируемых устройств. Использование программируемых ПЛИС не распространено, как правило, из-за высокой стоимости. Это происходит, когда нет возможности использовать другое более дешевое решение.
Микроконтроллеры
Однокристальные микроконтроллеры являются основным выбором для встраиваемых систем малого и среднего размера. Благодаря интеграции FLASH-памяти, оперативной памяти и всех других периферийных систем в одну систему центрального блока, они позволяют значительно снизить стоимость устройства. Когда одна микросхема составляет полную микропроцессорную систему, полное устройство получается путем подключения к внешним портам нескольких дополнительных элементов. Печатная плата также относительно проста, так как нет необходимости запускать широкие шины к памяти и может быть реализована в двухслойном виде.

На рынке представлено много типов микроконтроллеров, от небольших 8-битных AVR, до очень мощных микроконтроллеров с ядром ARM, таких как STM32. Первые однокристальные микроконтроллеры имели мало аппаратных ресурсов. Типичным примером является популярный чип 8051, разработанный Intel. Он включает в себя блок ЦП с производительностью 1 DMIPS 12 МГц, 128 Б ОЗУ и 8 КБ ПЗУ или FLASH-памяти. Микроконтроллеры этого семейства обычно использовались в небольших системах примерно до 2000 года, затем постепенно вышли из употребления, заменившись лучшими 8-битными конструкциями. Выпускаются они и по сей день, например Microchip выпускает классические микроконтроллеры с FLASH памятью — 80c51, 89C2051. Подобные системы также можно найти в предложениях таких компаний, как Infineon, Analog Devices или Silicon Labs. Некоторые из них имеют значительно улучшенное ядро, выполняющее инструкции за 1 или 2 такта, и поставляются в современных корпусах SMD TQFP, поэтому их можно использовать в современных продуктах.
Примером является 8051F00/1/2/5/7 Silicon Labs, что имеет значительно улучшенное ядро 8051 с конвейерной обработкой инструкций, которая в основном выполняется за один или два тактовых цикла. Содержит 2 КБ XRAM, 256 ГБ встроенной памяти и широкий спектр периферийных устройств, а также флэш-память ISP. Хотя создание новых устройств на базе микроконтроллера с ядром 8051 несколько спорно, такие системы можно использовать везде, где есть старый код, написанный, например, на ассемблере и где не выгодно создавать новое ПО с нуля.
Хотя экспансия 32-битных микроконтроллеров ARM происходит уже по-полной, и можно купить МК с ядром Cortex-M0 всего за несколько рублей, чуть более современные 8 и 16 битные микроконтроллеры по-прежнему пользуются большой популярностью среди разработчиков. В первую очередь из-за того, что подготовка ПО для такого микроконтроллера намного проще, чем в случае систем с ядром ARM. Для многих периферийных устройств достаточно установить несколько битов в регистрах конфигурации и схема уже работает. В настоящее время наиболее популярными 8-битными устройствами являются микроконтроллеры AVR и PIC, а среди 16-битных — PIC и dsPIC.

Свою значительную популярность микроконтроллеры AVR приобрели после 2002 года, постепенно вытесняя популярные в то время чипы на ядре 8051. Благодаря модернизированному центральному блоку они работали в несколько раз быстрее, что позволило значительно сократить потребление энергии. К 2003 году производитель Atmel продал более 500 миллионов микроконтроллеров этого типа. Ядро AVR основано на гарвардской архитектуре с отдельными инструкциями для доступа к памяти программ и памяти данных. При конвейерной обработке большинство 8-битных инструкций выполняются за 1 или 2 такта. Микроконтроллеры AVR были разделены на несколько подтипов в зависимости от назначения, доступной памяти и периферийных систем:
TinyAVR — предназначен для самых простых и дешевых встраиваемых систем. Ядро микроконтроллера имеет упрощенный набор инструкций и лишено, например, операций умножения. Он также содержит очень ограниченный набор периферийных устройств и небольшую FLASH-память размером от 0,5 кБ до 32 кБ. Микросхемы этого типа выпускаются в небольших корпусах от 6 до 32 выводов, а их цена настолько привлекательна, что их выгодно использовать в качестве замены нескольким небольшим цифровым микросхемам. Самая маленькая микросхема этого типа — ATTINY4 в корпусе SOT23-6 с FLASH-памятью 512 Б и ОЗУ 32 байта.
MegaAVR — это основная продуктовая линейка, чипы имеют FLASH память в диапазоне 4…256 кБ и доступны во многих типах корпусов от 28 до 100 выводов. Они могут содержать множество интересных периферийных устройств, а ядро имеет стандартный набор инструкций, таких как доступ к памяти размером более 64 КБ или инструкция умножения. Но инструкция деления DIV (которую архитектура AVR не включает) отсутствует. Одними из самых популярных в России стали микроконтроллеры ATMEGA8/48/88/16/32 благодаря хорошему соотношению цена-качество.
XMEGA — самая продвинутая серия из семейства AVR. Они содержат усовершенствованные блоки повышающие эффективность вычислений, такие как контроллер прямого доступа к памяти (DMA), система обработки событий или криптографический сопроцессор. Они оснащены памятью программ емкостью 16…384 кБ и выпускаются в корпусах до 100 выводов. Также значительно увеличена тактовая частота ядра, которая может составлять 50 МГц. Микросхемы такого типа, в силу того, что они создавались в период утверждения на рынке 32-битных микроконтроллеров, не снискали большой популярности.

Другое семейство, которое до сих пор пользуется относительно высокой популярностью, — это семейство микроконтроллеров PIC, разработанное компанией Microchip Technology. 8-битные и 16-битные микроконтроллеры этого семейства до сих пор имеют своих сторонников. Первые, доступные с ПЗУ, появились на рынке еще в 1976 году, а к 2013 году компания продала более 12 миллиардов чипов этого семейства. Как и его предшественник, ядро микроконтроллера основано на гарвардской архитектуре и выполняет большинство инструкций за 2 или 4 такта. В отличие от современных архитектур, он имеет набор регистров, предназначенных для конкретных задач, например, аккумулятор WO или стек аппаратной системы, в котором хранятся адреса возврата из подпрограмм. В более старых версиях к стеку не обращались программно, что изменилось только с серии F18. Эти архитектурные особенности делают его не очень подходящим для использования компиляторов языков более высокого уровня, таких как C, или вытесняющих реализаций ОС (хотя такие компиляторы существуют). Они были разделены на подсемейства, используемые для сегментации рынка — доступны следующие подтипы:
- PIC10/12 — доступны в корпусах от 6 до 40 выводов. Это серия простейших МК, предназначенных для базовых решений. Обладает малым программным адресным пространством до 512 слов (12 бит), один из самых известных микроконтроллеров этой серии — PIC10f32x.
- PIC16 — очень распространен в небольших системах. Оснащен памятью данных до 2048 15-битных слов и 8-уровневым аппаратным стеком.
- PICF18 — программисты постепенно отходили от программирования встраиваемых систем на языке ассемблера в пользу языка C, что потребовало изменения архитектуры PIC, чтобы сделать ее дружественной к компиляторам. Так было создано семейство PICF18, которое обрело более глубокий и программно-адресуемый стек глубиной 31 уровень, дополнительные условные инструкции и линейно-адресуемое пространство регистров специального назначения.
- PIC24 и dsPIC — на основе архитектуры PICF18 были разработаны 16-битные чипы PIC24 и dsPIC для продвинутых решений и вычислений DSP. Микроконтроллеры имеют регистры 16 бит, увеличенный до 24 бит счетчик команд, а размер памяти программ может составлять 64 кБ. Версия dsPIC дополнительно включает набор инструкций, полезных для цифровой обработки сигналов, таких как умножение с накоплением, инверсия битов, аппаратное деление и так далее.
Восьмибитные микроконтроллеры, которые 15 лет назад играли основную роль во встраиваемых системах, с приходом «ARM-революции» уступили место 32-битным микроконтроллерам, преимущественно с ядром ARM. Революцию начала компания NXP в 2004 году, представив по конкурентоспособной цене гораздо более быстрые чипы LPC2000 с 32-разрядным ядром ARM7TDMI-S, что привело к массовому отказу от 8-разрядных решений.

Чипы ARM берут свое начало в микропроцессорах домашних компьютеров и более крупных SoC. Первым чипом модифицированным с учетом микроконтроллеров было ядро ARM7TDMI-S, полученное из микропроцессоров общего назначения и поэтому не полностью подходило для встраиваемых систем. Самыми большими недостатками этого устройства были отсутствие четко определенных режимов энергосбережения и внешний контроллер прерываний VIC, который не мог обрабатывать вытеснение. Эти недостатки заставили ARM разработать центральные блоки для микроконтроллеров, и таким образом было создано ядро Cortex-M3, а затем его последующие варианты адаптированы для различных сегментов рынка, таких как Cortex-M0/M4/M7.
Важной особенностью является то, что ARM не производит готовых микросхем, а лишь передает лицензии на центральные блоки другим производителям. На рынке можем купить сотни различных типов чипов от разных производителей, с разной периферией, но с одинаковым набором инструкций. Это большое преимущество, потому что мы можем использовать тот же набор инструментов, например, отладчик компилятора, без необходимости покупать новые инструменты при смене производителя. Также важен доступ ко всем инструментам под лицензией с открытым исходным кодом, что значительно удешевляет проект. Можно сказать что микроконтроллеры с центральным блоком ARM являются отраслевым стандартом, как и 30 лет назад функции этого стандарта выполняли системы на базе блока 8051.
В современных микроконтроллерах с ядром ARM используются ядра Cortex четырех разновидностей:
Cortex-M0/M0+ — предназначен для самых простых систем, цена которых позволяет конкурировать с 8-битными. Построен на архитектуре ARMv6m с трехступенчатой конвейерной обработкой, встроенным контроллером прерываний, поддерживающим до 32 прерываний, и производительностью 0,9 DMIPS/МГц. Выпускаются многими компаниями, наиболее популярными из которых являются NXP LPC1100/1200/800, STMicroelectronics STM32F0/L0, Toshiba TX00, Renesas S1. Обычно они имеют память программ 2…32 кБ и память данных до 8 кВ, выпускаются в корпусах с размерами от 5 до 64 выводов. Набор периферийных систем относительно прост. Наиболее распространены базовые периферийные устройства, такие как последовательные порты, SPI-контроллер, I2C и так далее, а их рабочая частота достигает нескольких десятков МГц.
Cortex-M3 — на сегодня наиболее часто используемые МК с ядром ARM благодаря относительно простой конструкции и очень хорошему соотношению цены и качества. Они основаны на архитектуре ARMv7m с 3-ступенчатой конвейерной обработкой и контроллером прерываний, поддерживающим до 256 внешних источников. Опционально они могут быть оснащены блоком FPU, выполняющим аппаратную обработку вычислений над числами с плавающей запятой. Типичными представителями серии являются микроконтроллеры производства NXP (LPC13xx, LPC17xx), STMicroelectronic (F1, F2). Они характеризуются памятью программ от 32…256 кБ и памятью данных от 6 до 128 кБ. Часто оснащены богатым набором периферийных устройств, таких как контроллер прямого доступа к памяти (DMA), USB-контроллер, Ethernet-контроллер и другие.
Cortex-M4 — имеют гораздо более высокую производительность, немного дороже. Они основаны на архитектуре ARMv7E-m с 3-ступенчатой конвейерной обработкой, оснащены блоком предсказания ветвлений, кроме того, оснащены набором инструкций для алгоритмов DSP и дополнительным блоком с плавающей запятой одинарной точности. Типичными представителями этой линейки являются микроконтроллеры NXP LPC40xx/53xx STM32F3/4 или Texas Instruments (TM4C). Они оснащены объемом памяти от 32 до 1024 кБ, оперативной памятью 8…512 кБ и богатым набором периферийных систем. Работают на частоте, близкой к 200 МГц, и имеют КПД 1,25 DMIPS/МГц.
Cortex-M7 — самые производительные микроконтроллеры и самые дорогие. По сравнению со своими предшественниками значительно расширены, центральный блок основан на ядре ARMv7E-M с улучшенной 6-ступенчатой конвейерной обработкой и сопровождается блоком с плавающей запятой двойной точности. Могут быть оснащены КЭШ-памятью первого уровня для инструкций и данных объемом до 64 КБ. Имеют программную память до 2 МБ, оперативную до 1 МБ и передовые периферийные устройства. МК работают на частоте более 200 МГц и достигают эффективности 2,14 DMIPS/МГц. Типичными представителями этой линейки являются: ATMEL SAMS70, STMicroelectronic STM32F7 или Freescale KV5x. К сожалению, такая высокая эффективность связана с соответственно высокой ценой. Часто в системах такого типа внутренней памяти недостаточно, особенно когда надо подключить цветной TFT дисплей. Это делает выбор данного типа микроконтроллеров дискуссионным решением, тем более, что в настоящее время по сопоставимым ценам можем получить целые компьютеры построенные на базе SoC-систем, способные работать под управлением полноценных ОС. Если же не нужно работать с системами реального времени в сложном временном режиме, системы SoC часто оказываются лучшим выбором.

Помимо МК с ARM-ядром, которые в значительной степени доминируют на рынке, также можем встретить PIC32. Microchip использует в своих микроконтроллерах архитектуру MIPS32 с производительностью и параметрами, аналогичными ARM-архитектуре. На базе этого блока были созданы 4 семейства микроконтроллеров на базе разных типов архитектуры MIPS32:
- PIC32MX — на базе ядра M4K, производительность аналогична Cortex-M3;
- PIC32MZ — работает на максимальной частоте 250 МГц и по производительности аналогичен схемам на базе Cortex-M7;
- PIC32MM — предназначен для экономичных и энергосберегающих устройств, эквивалентен архитектуре Cortex-M0;
- PIC32MK — предназначен для автомобильной электроники.
Чипы не завоевали много сторонников, в основном используются в автомобильной промышленности и конструкторами, привыкшими к Microchip.
Интегральные микросхемы SoC
Старшими родственниками микроконтроллеров являются SoC — интегральные микросхемы, содержащие полную электронную схему, включающую цифровые, аналоговые, радио и цифро-аналоговые схемы. Отдельные модули этой системы из-за их сложности обычно поставляются разными поставщиками. Центральный блок может поставляться одним поставщиком, например, ARM, а порты последовательной связи — другим или являться собственной разработкой. Встраиваемые системы — типичная область применения SoC, и наибольшее распространение получили на базе процессоров в архитектуре ARM. В случае SoC-систем чаще всего используются ядра прикладных процессоров семейства ARM Cortex-A. У них есть MMU (блок управления памятью) вместе с обширными микросхемами кэш-памяти. Они также могут быть многоядерными.
При невозможности интегрировать все блоки SoC на одной полупроводниковой подложке, отдельные модули изготавливаются на отдельных структурах и целиком заключаются в один корпус. Такое решение называется SiP (System-in-package), но оно менее экономично, особенно при производстве полупроводников большими сериями.
Другим решением, используемым в мобильных телефонах, когда внутри не так много места, является технология PoP (Package-on-package). Оно заключается в использовании двух интегральных микросхем, одна из которых монтируется под другой. Как правило, микросхема, расположенная под ней, представляет собой микросхему типа SoC, а микросхема оперативной и/или флэш-памяти размещается поверх нее.

Самая большая разница между микроконтроллерами и SoC заключается в объеме памяти который им требуется для работы. В случае микроконтроллеров это обычно менее 100 КБ ОЗУ и менее 1 МБ FLASH-памяти. Для SoC требуются внешние микросхемы RAM и FLASH-памяти, а термин «схема на кристалле», в основном в случае более крупных систем, является просто метафорой, определяющей направление проектных работ, а не фактической реализации. Кроме того, SoC оснащаются ЦП с относительно высокой вычислительной мощностью, которые благодаря блоку управления памятью MMU позволяют запускать известные по компьютерам операционные системы, такие как Linux или QNX, а также могут поддерживать более специализированные периферийные устройства.
Правда нужно помнить, что такие решения не подходят для использования в системах жесткого реального времени, где требуется максимально детерминированное время отклика. Виртуальная память и блок управления памятью MMU делают время отклика системы недетерминированным. Это связано с тем, что преобразование виртуального адреса (VA) в физический (PA) требует некоторого времени для MMU, чтобы найти и просмотреть таблицу страниц в основной памяти.
Чтобы сократить это время используется механизм TLB, называемый ассоциативной памятью, который значительно сокращает время трансляции адресов для наиболее часто используемых страниц. Есть возможность навсегда заблокировать некоторые транковые адреса в TLB, что часто используется в системах реального времени с мягким режимом времени.

Пример типичной SoC-системы с ядром ARM показан на рисунке. Внутри системы имеются классические периферийные системы, известные по микроконтроллерам, но обычно гораздо более сложные. Характерно отсутствие внутренней оперативной памяти и флэш-памяти программ, которые необходимо подключать в виде внешних микросхем. Поскольку шины памяти должны работать на высокой частоте (особенно SDRAM), требуется сложная многослойная конструкция печатной платы, что значительно увеличивает затраты.

В последнее время на рынке наблюдается поток компьютеров SBC (Single Board Computer), основанных на системах SOC с ядром ARM. Конструкторы охотно используют их из-за их эффективности и низкой цены. Это решение избавляет от необходимости проектировать сложную систему, а доступ к большой базе данных открытого программного обеспечения позволяет быстро разрабатывать очень продвинутые структуры, благодаря чему готовое устройство создается в короткие сроки. Поэтому давайте сосредоточимся на кратком обзоре наиболее популярных готовых решений SBC, которые можно использовать в небольших сериях прототипов.
Начнем обзор с Raspberry Pi, у которого уже есть четвертая партия. Он имеет 4 ГБ оперативной памяти, оснащен 4-х ядерным 64-битным процессором с высокопроизводительными ядрами Cortex-A72. В качестве канала связи может использоваться модуль Wi-Fi 2,4 ГГц/5 ГГц или порт Ethernet. Компьютер имеет графический чип поддерживающий 3D или декодирование видеопотока. Самым большим преимуществом этого решения является очень богатая техническая документация и множество программного обеспечения с отличной поддержкой сообщества. Компьютер используется при разработке прототипов и для самодельных проектов. Из-за расположения разъемов и используемых компонентов он не предназначен для промышленного применения. Существует множество аксессуаров и дополнительных модулей, предназначенных для работы с RPi, таких как корпуса или дополнительные платы, подключаемые к 40-контактному разъему, который уже служит определенным стандартом. Компьютер имеет графический чип, поддерживающий поддержку 3D или декодирование видеопотока.

При обсуждении Raspberry Pi также стоит упомянуть более скромную версию — Raspberry Pi Zero. Он имеет одноядерный SoC с несколько старым ядром ARM11. Оснащен 512 МБ оперативной памяти и графическим процессором для отображения. Его самым большим преимуществом является доступная цена, что ставит под сомнение целесообразность использования более крупных однокристальных микроконтроллеров, часто стоящих больше, чем весь компьютер. Правда следует помнить, что для работы ему нужна SD-карта, что удорожает решение. Важным преимуществом также является разъем, который позволяет использовать этот компьютер в качестве базы для собственного устройства. Да и конструкция не предназначена для использования в промышленных условиях.

Если говорить о более серьезных устройствах, гораздо лучшим решением будет использование платы со встроенной памятью NAND Flash или eMMC. Платы оснащенные микроконтроллером Sitara AM335x от Texas Instruments хороший выбор. Примером может служить компьютер BeagleBone Black с тактовой частотой 1 ГГц, 512 МБ ОЗУ и 4 ГБ флэш-памяти. Компьютер имеет ряд коммуникационных интерфейсов: USB, HDMI и Ethernet.
Интересным решением является плата NanoPI Neo 2 с 64-битным 4-ядерным процессором Cortex-A53 с тактовой частотой 1 ГГц. Она содержит 512 МБ памяти DDR3, 8 ГБ памяти eMMC (на которую можем установить операционную систему и программное обеспечение), а также гигабитный разъем Ethernet и два порта USB. Если же нужна очень высокая вычислительная мощность, например, для обработки изображений или виртуальной реальности, очень интересным предложением является плата Nvidia Jetson Nano с 4-х ядерным процессором с ядрами Cortex-A53 и графическим процессором Nvidia Maxell со 120 CUDA-ядра. Все это работает на частоте 1,43 ГГц.

Последнее решение, обычно используемое в наиболее требовательных встраиваемых системах, — это использование программируемой FPGA и реализация процессора в виде «SoftCore». Это решение сравнительно редко используется в профессиональных системах, в основном из-за значительных затрат, а кроме того требует дополнительного оборудования, такого как конфигураторы и силовые секвенсоры. Ситуация меняется с появлением таких устройств, как Altera Lattice MachO2 и MAX10, которые интегрируют готовую к работе FPGA в единую структуру, эквивалентную однокристальному микроконтроллеру в мире программируемых устройств.
Чип SoC или однокристальный микроконтроллер
У конструктора встраиваемых устройств есть как системы на базе однокристальных микроконтроллеров, так и продвинутые SoC-системы. Выбрать правильное решение при широком предложении на рынке непросто.
Простейшие встраиваемые устройства, такие как контроллеры печей центрального отопления, контроллеры кондиционирования воздуха или термостаты, обычно строят на базе микроконтроллеров, в основном из-за стоимости и из-за того, что для управления такими процессами достаточно даже простейших решений. В более продвинутых устройствах, где нужна поддержка сети, цветные ЖК-дисплеи и так далее, выбор не так очевиден. Цена более совершенных микроконтроллеров, способных справиться с вышеперечисленными задачами, может даже превышать цены более простых решений на базе SoC-систем. Дополнительным преимуществом использования чипа SoC является возможность использования операционной системы Linux и ее богатых ресурсов. В случае с микроконтроллером в нашем распоряжении есть операционные системы реального времени, и большую часть программного обеспечения должны подготовить сами.
Еще один критерий выбора — нужно ли устройству управлять процессами в реальном времени. Если таких требований нет или требуется только система типа «мягкое реальное время», то можем использовать ядро Linux с дополнительными патчами реального времени. Но когда имеем дело с системой «жесткого реального времени», вынуждены использовать однокристальный микроконтроллер и систему реального времени. В случае более продвинутых устройств реального времени можем рассмотреть сценарий с двумя системами, где микроконтроллер управляет процессом реального времени, а другие задачи, такие как работа с графическим дисплеем, обслуживание пользователей или связь с удаленной системой, делегированы системе SoC.
Программное обеспечение
Важным вопросом, связанным со встраиваемыми системами, является программное обеспечение, как работающее в целевой системе, так и поддерживающее разработку программного обеспечения для них: компиляторы, отладчики, интегрированные среды разработки и так далее.
Программное обеспечение для однокристальных микроконтроллеров. Сейчас создают ПО для микроконтроллеров в основном на ANSI — C и C++. В случае с программным обеспечением для самых маленьких 8-/16-битных микроконтроллеров из-за очень ограниченных ресурсов используется почти исключительно ANSI — C. Некогда популярный ассемблер используется в основном в виде вставок, например, с несколькими десятками байтов.
Если встроенная система включает в себя более продвинутый 32-х битный микроконтроллер с ядром ARM, с большим объемом флэш-памяти и оперативной памяти, можем использовать язык C++ в последнем стандарте ISO/IEC 14882:2017, — это рекомендуемое решение. Умелое использование языка C++ повышает безопасность кода и сокращает время подготовки программного обеспечения без существенного увеличения требований к оборудованию.
Программное обеспечение для самых маленьких встраиваемых систем создается без использования ОС. В этом случае программа работает в режиме переднего и заднего плана на основе конечных автоматов и циклов обработки событий. Большая часть кода также выполняется непосредственно в обработчиках прерываний. Если для простейших проектов написание такого ПО не вызывает особых проблем, то в случае более продвинутых систем проблематичным становится отсутствие механизмов многозадачности. В таких обстоятельствах на помощь приходят ОС реального времени, работающие на небольших микроконтроллерах. Требования к современным системам, такие как поддержка сети, цветные сенсорные дисплеи, современные и сложные в использовании USB-шины, делают такое программное обеспечение сложным. На рынке существует множество операционных систем для небольших микроконтроллеров, подавляющее большинство из которых являются решениями с открытым исходным кодом. В основном системы для микроконтроллеров не являются операционными системами в полном смысле этого слова, содержащими механизмы для драйверов устройств, управления памятью, управления пользователями или работы в сети. Их следует рассматривать скорее как библиотеку потоков, чем как полноценные ОС. Сердцем является механизм обработки потоков/задач, а также механизм межпроцессного взаимодействия и синхронизации. Дополнительные функции, которые может выполнять система, — это управление памятью или драйверы устройств, но это не обязательные элементы.

Для систем без MMU драйверы устройств не нужны, поскольку приложения работают в общем пространстве и имеют доступ ко всем ресурсам, включая систему прерываний и адресное пространство периферийных устройств.
Одной из старейших и широко используемых систем является FreeRTOS, которая может работать на целом ряде микроконтроллеров, от 8-битных AVR до 32-битных ARM. Она была написана на C и ориентирована в основном на простоту и возможность быстрого переноса на разные архитектуры. В настоящее время может работать на более чем 30 различных аппаратных архитектурах и в своей базовой форме включает поддержку таких механизмов, как создание задач, элементы синхронизации и межпроцессного взаимодействия, а также базовую поддержку динамического управления памятью. Главный недостаток заключается в том, что написана на ANSI-C с большим количеством макросов и различных современных приемов программирования, которые уже не рекомендуются.
Интересной системой является ChibiOS, под лицензией GPL, предназначенная для 8-/16-/32-битных микроконтроллеров. Доступна для меньшего числа аппаратных архитектур и в базовой версии может занимать от 1,2 кБ до 5,5 кБ FLASH-памяти. Она содержит более обширные механизмы синхронизации, а исходный код намного современнее, чем у вышеописываемой системы. Помимо самой библиотеки потоков, ее необязательной частью может быть механизм драйверов устройств и графическая библиотека uGFX для различных дисплеев.
Еще одна система — ISIX, предоставляющая функциональность, аналогичную представленной ранее системе ChibiOS. Её ядро было написано на ANSI-C, а остальное создано с использованием стандарта C++17.
Если имеется больше доступной памяти, можем использовать систему реального времени NuttX для 8 и 32 битных микроконтроллеров. Основное ее допущение — соответствие стандартам ANSI и POSIX, что позволяет компилировать и запускать большую часть библиотек, предназначенных, например, для операционной системы Linux. Это одна из самых обширных систем такого типа, поскольку помимо стандартного API POSIX она включает в себя подсистему драйверов устройств, виртуальную файловую систему и поддержку сети. Она также поддерживает Wi-Fi, NTFS, сетевые карты, USB как хост, так и устройство. К сожалению, высокая совместимость с этими системами влечет за собой относительно высокие требования к памяти и оборудованию для микроконтроллеров.
Большая популярность технологии IoT привела к тому, что крупные концерны заинтересовались системами для микроконтроллеров, примером чего является LiteOS от Huawei. Она доступна под лицензией BSD, и можно запускать её на самых важных аппаратных архитектурах: ARM, x86, RISC-V. Она характеризуется очень легкой структурой в базовой версии, занимающей менее 10 КБ FLASH-памяти. Её основное предназначение — Интернет вещей, поэтому особый упор был сделан на системы связи, короткое время отклика и низкое энергопотребление. Поддерживается Wi-Fi, Ethernet, BLE, ZigBee и многие другие популярные протоколы IoT. Системой аналогичного назначения является ZephyrOS, разрабатываемая под крылом Linux Foundation, и в ее разработку входят, среди прочего, Intel, NXP, Linaro или Texas Instruments.
Несколько лет назад единственным ПО, предоставляемым производителями однокристальных микроконтроллеров, были заголовочные файлы с описаниями регистров. Остальное легло на плечи программиста. В настоящее время ситуация иная, производители превосходят друг друга предоставляя полные библиотеки, которые путем вызова нескольких функций позволяют удобно активировать периферийные устройства в микроконтроллере. Правда в старых микроконтроллерах периферийные системы были намного проще, обычно достаточно было изменить несколько битов в регистрах и система была готова к работе.
Современные периферийные устройства становятся все более сложными, с рядом дополнительных опций и гораздо более трудными в эксплуатации. Время, необходимое конструкторам для разработки устройства, значительно сократилось. Поэтому возникла необходимость в предоставлении периферийных библиотек для упрощения и ускорения времени подготовки проекта.
Сегодня, к счастью, большинство крупных производителей микросхем предоставляют готовые библиотеки, так что не придется оперировать регистрами, как несколько лет назад. В случае микроконтроллеров STM32 это библиотека STM32Cube, которая интегрируется с служебным программным обеспечением, предоставляемым производителем. Совершенно отдельная тема — качество исходных кодов, предоставляемых производителями, которое зачастую оставляет желать лучшего. В случае микроконтроллеров STM32 это библиотека STM32Cube, которая интегрируется с служебным ПО, предоставляемым производителем.
Программное обеспечение для SoC/SBC
Системы SoC благодаря использованию центрального блока, представляющего собой полноценный микропроцессор с поддержкой виртуальной памяти, открывают доступ к богатой базе данных программного обеспечения, предназначенного для стандартных компьютерных систем. Возможность запуска полноценной ОС общего назначения дает доступ к богатой базе данных программного обеспечения и библиотек. В эпоху растущих требований к встраиваемым системам, таких как поддержка графического дисплея или сложного интерфейса, единственный способ подготовить программное обеспечение в короткие сроки — использовать полноценную систему с широкой программной базой. Тогда можно сосредоточиться на подготовке основного функционала устройства без необходимости вдаваться в детали низкого уровня. Тем самым значительно удешевляем разработку и сокращаем время доставки устройства заказчику. Особую популярность здесь приобретают операционные системы, разработанные на основе модели с открытым исходным кодом. Они разрабатываются сообществом (в основном крупными компаниями), что обеспечивает значительную экономию времени и денег.
Самой популярной ОС, используемой во встраиваемых системах, является Linux, которая работает практически на всех существующих SoC. Ядро Linux является стандартом в мире встраиваемых устройств, поэтому каждый крупный производитель микросхем обеспечивает поддержку этой системы. Когда используем слово Linux, как раз и имеем в виду ядро самой операционной системы. С другой стороны, вся система, кроме самого ядра, состоит из библиотек и приложений. Структура типичного программного стека Linux показана ниже. На самом низком уровне системное ядро, которое отвечает за управление памятью, процессами и работу с устройствами ввода-вывода через драйверы устройств. Ядро предоставляет стандартный API системных вызовов, но чаще всего пользовательские приложения не обращаются к нему напрямую, они используют только промежуточные библиотеки.
Наиболее важной библиотекой, предоставляющей базовый API для приложения, является libc. Библиотека предоставляет приложениям стандартный интерфейс, написанным на языке C, и доступ к самым низкоуровневым функциям связанным с системой, таким как: управление процессами, управление памятью, межпроцессное взаимодействие и другие. Ещё там есть libDRM, отвечающая за графическую систему, libasound, отвечающая за обработку звука, и libevdev, отвечающая за обработку устройств ввода, таких как мыши, клавиатуры, сенсорные экраны.

Существует множество вариаций Linux, называемых дистрибутивами, созданными различными поставщиками и сообществом. В то время как подготовка системы для ПК не представляет проблемы, в связи с тем что архитектура ПК строго определена, в случае встраиваемых систем, которые бывают многих разновидностей, подготовка дистрибутива намного сложнее. Во-первых, много архитектур и аппаратных конфигураций, а во-вторых, ставим совершенно другие требования к встраиваемым системам. Программное обеспечение маршрутизатора потребует совершенно другого набора библиотек и приложений, чем программное обеспечение используемое для управления станком с ЧПУ. Существуют универсальные дистрибутивы для встраиваемых систем, но большинство из них используется только на стадии прототипирования или любительских проектов.
Самая большая проблема с готовыми дистрибутивами — они содержат огромное количество программного обеспечения которое не обязательно адаптировано и оптимизировано для данного решения. Создавая собственный дистрибутив с нуля, можем адаптировать систему под специфику проекта.
Наиболее популярными готовыми дистрибутивами для архитектуры ARM являются: Debian, Ubuntu для IoT, Arch Linux ARM. Это дистрибутивы, аналогичные тем, которые известны для компьютеров ПК, но установка на компьютер SBC может быть более сложной. При использовании готового дистрибутива должны учитывать, что часто будет необходимо предоставить собственный загрузчик или ядро с параметрами, характерными для своей платы SBC, что они содержат много программного обеспечения не обязательно адаптированного и оптимизированного для данного решения.
Если планируем поставлять устройство не являющееся прототипом, лучше собрать Linux-систему из исходников, адаптированных для нашего устройства. Подготавливая образ диска таким образом, контролируем весь процесс компиляции, включая специальную оптимизацию для архитектуры и адаптацию отдельных компонентов точно под свои требования. Такой подход позволяет построить безопасную и высокооптимизированную систему предназначенную для конкретных нужд.
Пошаговая компиляция всей системы — сложная и трудоемкая задача, на что давно обратило внимание сообщество, подготовившее соответствующие инструменты для автоматизации подготовки собственного дистрибутива. В настоящее время существует два конкурирующих решения: простой Buildroot и более сложный Yocto Project.
Buildroot — это набор файлов Makefile и набор исправлений, которые автоматизируют процесс подготовки образа системы Linux. Позволяет выбирать отдельные компоненты системы и параметры конфигурации с помощью меню KCONFIG. Для правильной работы нужен только инструмент make и компилятор, который может собрать код для архитектуры хостинга. Остальные элементы, включая кросс-компилятор для целевой архитектуры, компилируются непосредственно из исходных кодов.
Buildroot поддерживает множество аппаратных архитектур: x86, ARM, MIPS, PPC. Также позволяет выбрать одну из нескольких доступных библиотек языка C, подготовить образ для загрузки на целевую плату и создать отдельные компоненты с помощью диспетчера пакетов.
В настоящее время наиболее рекомендуемым инструментом для создания собственных дистрибутивов выступает проект Yocto, поддерживаемый и разработанный Linux Foundation. Он предназначен для создания собственных дистрибутивов Linux для устройств IoT и поддерживает более 22 различных аппаратных архитектур. Основан на объектно-ориентированном подходе и слоях программного обеспечения, которые накладываются друг на друга. Его самым большим преимуществом является множество конфигурационных файлов, описывающих способ сборки и компиляции отдельных библиотек, программ или других компонентов.
Помимо Linux, который безраздельно господствует во встраиваемых системах (как Windows на компьютерах), некоторую популярность имеют и другие операционные системы, предназначенные для этой цели. Одной из них является Android Things, представленный Google в 2015 году. Её основное предназначение — встраиваемые устройства с небольшим объемом оперативной памяти 32 МБ. Система поддерживает связь по протоколам BT и Wi-Fi. Как и в классическом Android, она содержит виртуальную машину JVM, поэтому можем легко запрограммировать её на Java. Тут богатый набор библиотек, включая поддержку низкоуровневых интерфейсов: I2C, SPI или поддержку портов GPIO напрямую из Java.
Еще одна популярная система — это Windows 10 IoT от Microsoft. Это платная система с закрытым исходным кодом, предназначенная для устройств с относительно небольшим объемом оперативной памяти. Основана на ядре NT и позволяет писать приложения с использованием технологии .NET. Также позволяет использовать Win32 API, известный из полной версии Windows. Может работать как на процессорах x86, так и на ARM, но из-за того что надо платить лицензионные отчисления — не пользуется большой популярностью.
Программное обеспечение для встраиваемых систем
Соответствующие инструменты программирования могут значительно ускорить разработку ПО и время выхода на рынок. В начале разработки встраиваемых систем, когда господствовали 8-битные системы, программное обеспечение чаще всего писалось на ассемблере. Позже на рынке стали появляться компиляторы C, значительно облегчившие подготовку.
Тем временем оказалось что ранние архитектуры, такие как 8051 и PIC, не полностью подходили для выполнения сгенерированного компилятором кода из-за отсутствия адресного стека (PIC) или различных способов адресации памяти (8051). Производители микроконтроллеров заметили эту проблему и начали разрабатывать или модифицировать ядра МК, чтобы они лучше работали с компиляторами языка Си всего в несколько кликов. Сначала это были коммерческие решения, которые стоили больших денег и были недоступны небольшим компаниям. Со временем сообщество начало разрабатывать компилятор GCC для архитектур AVR и ARM, а компилятор SDCC разрабатывался параллельно для архитектур PIC и 8051. Ранние версии компиляторов тех времен были далеки от коммерческих решений, особенно по размеру и скорости получаемого машинного кода. Производители признали, что инструменты предлагаемые по высоким ценам, не являются хорошим решением, так как значительно снижают продажи. Поэтому компании стали интересоваться разработкой компиляторов под свободными лицензиями.

Тем временем на рынке появилась среда Eclipse, позволяющая создать собственную IDE. На основе Eclipse и GCC производители начали предоставлять бесплатные интегрированные среды разработки. В настоящее время каждый уважающий себя производитель микроконтроллеров предоставляет такую среду бесплатно. Но несмотря на существование IDE, все же лучшим решением будет подготовка и создание программного обеспечения для микроконтроллеров, основанное непосредственно на таких инструментах, как make или waf, потому что для правильной сборки проекта нужен только компилятор, а остальное пойдет с помощью автоматических скриптов. Важно что мы полностью контролируем проект и независимы от производителя.
Если же создаем приложение для однокристальных микроконтроллеров, единственное что потребуется для написания и запуска ПО, — интегрированная среда IDE и, возможно, интерфейс JTAG. В случае с JTAG ситуация аналогична ситуации с компиляторами и IDE, где когда-то эти инструменты стоили тысячи долларов, а теперь их можно купить по копеечной цене.
В случае программного обеспечения для систем на базе SoC Linux ситуация иная и зависит от того, имеем ли дело с программным обеспечением загрузчика, драйверами для ядра Linux или написанием программного обеспечения в пользовательском пространстве. При этом большинство SoC-систем имеют поддержку загрузчика и ядра Linux, предусмотренную производителем. Набор программного обеспечения, необходимого для разработки приложений пользовательского пространства, ничем не отличается от набора предназначенного для разработки программного обеспечения для ПК.
Здесь понадобятся кросс-компилятор, отладчик gdb, работающий на ПК, и сервер gdb работающий на целевой плате. Все эти инструменты создаются автоматически, если используете инструменты Yocto или Buildroot для создания собственного дистрибутива. Кроме того, если привыкли к интегрированным графическим средам, то можем использовать бесплатные редакторы «Eclipse» или «Visual Studio Code». Писать софт в Linux однозначно удобнее чем создавать приложения для микроконтроллеров, потому что в нашем распоряжении гораздо больше памяти и блок MMU, что в случае грубых ошибок приложения предотвращает крах всей системы.
Итого: встроенные системы и их приложения менялись с годами. Раньше их можно было найти только в самых продвинутых устройствах, а средства разработки ПО стоили очень дорого. Со временем они становились все доступнее и цена опускалась ниже стоимости решений, реализованных без участия микропроцессоров. Доступность бесплатных инструментов также способствовала росту популярности, так что в настоящее время все заметнее становится тенденция ухода от однокристальных микроконтроллеров к системам на базе микросхем SoC.







