Рубрики Обзоры

Братья меньшие

Опубликовал
ITC.UA

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


Контроллер i8051 более чем
двадцатилетней давности. Несмотря на "возраст", по сей день чипы
этой архитектуры остаются востребованными для самого разного применения
— начиная от копеечных реализаций для бытовой электроники и заканчивая
радиационно-стойкими версиями космического назначения

Итак, почему же о действительно самых массовых компьютерах (сразу следует оговориться,
что микроконтроллеры — это более чем серьезные и вполне полноценные компьютеры)
пресса предпочитает помалкивать? Первое объяснение вполне очевидно — микроконтроллеры
создаются для того, чтобы их присутствие в конечном продукте не обнаруживалось
невооруженным глазом пользователя. Зачем человеку, каждое утро бреющемуся электробритвой,
знать о том, что ее двигателем, жидкокристаллическим индикатором и зарядным устройством
встроенного аккумулятора управляет N-битный контроллер такого-то семейства? Разве
что от неуемного любопытства. Такие немногочисленные неуемно любопытные, без сомнения,
это узнают и без участия технических писателей и журналистов. Микроконтроллеры
же "как вещь в себе" представляют интерес или для соответствующих технических
специалистов, или опять же — для неуемно любопытных.

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

Способность к обобщению — один из признаков интеллекта. Но все хорошо в меру, и необдуманное обобщение — это, простите, уже явная глупость. Поэтому даже не будем пытаться обобщать нижеприведенные сведения и цифры относительно всех классов компьютеров и программного обеспечения. Они справедливы и "работают" только в одной области компьютинга.

Онлайн-курс "Чистий код та патерни проєктування" від robot_dreams.
Прискорюйте й спрощуйте процес розробки.Під менторством лектора з 15-річним досвідом ви навчитеся застосовувати 20+ шаблонів, опануєте рефакторинг і принципи чистого коду.
Детальніше

Вот теперь, кажется, все готово к знакомству с "подводной частью" упомянутых выше причин.

Как вы думаете, о чем меньше всего любят говорить разработчики? И соответственно о чем меньше всего пишут технические журналисты (в конце концов, чтобы о чем-то рассказать, надо это "что-то" узнать, а это не представляется возможным)? Любящие аббревиатуры американцы такое "что-то" называют NREС (NonRecurring Engineering Costs) — "невозвращаемой стоимостью проектного этапа" (перевод хоть и не дословный, но лучше отражает суть понятия). В Штатах, впрочем, кроме склонности к аббревиатурам, умеют и удачно шутить, и для NREС придумали синоним BTML (Bane of Technology Manager’s Life). Перевести эту идиому можно, разве что вспомнив древний редкий анекдот с названием "Смерть пионера" — "Ужасная смерть управляющего технологическим процессом". Потому что малейшая оплошность на проектном этапе оборачивается для производителя непоправимой стратегической ошибкой. Все дело в том, что NREC — действительно невозвращаемая стоимость в том смысле, что она противоположна так называемой "возвращаемой стоимости" — COGS (Cost Of Goods Sold), с которой мы все как потребители хорошо знакомы. NREC — это то, что амортизируется постепенно, на протяжении всего жизненного цикла изделия. В "классических" индустриях, например в автомобильной промышленности, производители, затрачивающие несколько миллиардов долларов на проектирование новой модели (порядок затрат соответствует вовсе не уровню Ferrari, а обычным машинам потребительского класса), заранее планируют объемы сбыта, "растягивая" амортизацию NREC, что выражается при объеме выпуска в несколько миллионов машин данной модели в приросте COGS, скажем, на $1000. Ведь вернуть разом, с одной продажи одного изделия, NREC невозможно — никто не купит Opel Tigra за 3 млрд. долл. Вот отсюда и слово "невозвращаемая".


Топологическая схема кристалла
микроконтроллера семейства Motorola HC08, оснащенного 60 KB перепрограммируемой
памяти программ и 4 KB ОЗУ. STANDARD CELL AREA включает собственно ядро
микроконтроллера и ряд "периферийных" устройств

Вводная часть была долгой, и вопрос "причем тут микроконтроллеры?" уже
назрел. Но надо еще немного потерпеть, потому что это вопрос сложный вообще. Раз
мы уже взяли за пример автомобильную промышленность, давайте продолжим разговор
именно о ней. Проектировщик авто сталкивается со множеством противоречий. Так,
ему нужны одновременно очень легкие и прочные фрагменты кузова — их малый вес
означает сокращение материальных затрат на этапе массового производства, а прочность
— высокие эксплуатационные характеристики конечного изделия и достижение заданного
уровня пассивной безопасности. На основе таких примеров давно сформулировано проверенное
обобщение, утверждающее, что в классических индустриях действует правило: "стремление
к достижению максимума функциональности при минимуме веса". И как ни странно,
у этого правила есть предел, достижимый при… равенстве веса нулю(!). Более того,
данный предел имеет название, и вы его наверняка знаете. Это — firmware, "встраиваемое
программное обеспечение", те самые программы-невидимки, "вшитые"
в компьютеры-невидимки и придающие изделиям или дополнительную функциональность,
или же существенно улучшающие традиционные их функции.

Firmware-предел, к сожалению, — действительно экстремум. Не в математическом смысле. Это "экстремальная область". Здесь цена строки кода может "зашкаливать" за тысячи долларов, производительность труда программистов измеряется сотней (или даже десятками) строк кода в месяц. Стоимость тестирований, верификаций, натурных и полунатурных экспериментов выражается труднопроизносимыми цифрами. Впрочем, судите сами: один из лучших firmware-проектов, управляющее ПО для челноков Space Shuttle, разработанное IBM (в среднем один некритический дефект на 10 тысяч строк чистого кода), обошелся приблизительно в $1000 за строчку, без учета стоимости документирования.

Короче говоря, упомянутое ранее правило сегодня уточнено и звучит так: "firmware — бесконечные возможности за бесконечную цену при нулевом весе". Соответственно доля firmware в NREC современных промышленных изделий может достигать таких величин, что производители уже не просто не любят об этом говорить. Они вынуждены молчать хотя бы потому, что коммерческой тайны никто не отменял, а NREC — страшный коммерческий секрет, знание которого дает возможность оценить не только стратегические возможности компании, но и нанести в конкурентной борьбе тяжелейшие по последствиям удары. А firmware и микроконтроллеры — близнецы-братья. И несмотря на то что сегодня компьютеры-невидимки с программами-невидимками установлены чуть ли не в любом более-менее функциональном изделии, производитель об этом кричать на каждом углу не станет.

Вот круг и замкнулся: изготовители молчат — журналисты не пишут — микроконтроллеры "как бы есть", но их "как бы и нет".

Архитектуры-невидимки


Типичный образец симптомов
первого этапа "микроконтроллерной болезни" — макетная плата,
использующая ROMless-контроллер семейства i8032

Наш обзор начинается с первой трудности,
а именно определения понятия "микроконтроллер". Дело в том, что в существующем
разнообразии исполнений, архитектур, классов и видов микроконтроллеров уловить
что-то общее крайне трудно. Такие "народные приметы", как наличие встроенной
памяти программ и данных или интегрированные различные подсистемы, не годятся,
потому что есть обширные классы ROMless-микроконтроллеров (не оснащенных долговременной
памятью) и типичные представители микропроцессоров, располагающие бог знает чем
интегрированным. После долгих размышлений на ум приходит одно достойное определение-каламбур:
микроконтроллер — это такой специализированный компьютер, не представляющий самостоятельной
ценности (т. е. предназначенный для установки в некоторое конечное изделие), о
котором специалист по микроконтроллерам может уверенно сказать, что перед нами
именно микроконтроллер. К слову, то, что сами производители микроконтроллеров
называют "микроконтроллерами", под это определение попадает автоматически
— усомниться в компетенции их специалистов может разве что "юноша бледный
со взором горящим".

Вторая трудность — выбор классов (семейств) контроллеров, удостоенных ознакомления с ними читателя. Здесь не берутся в расчет "симпатии" и "приверженности" — не та область, и даже неуместно любование красотой архитектуры. Грамотных разработчиков данный фактор, по большому счету, не волнует, и они прекрасно знают, что эффективно решить некоторую задачу можно с помощью любого адекватного ее требованиям контроллера. Так что критерии здесь иные: на вес золота ценятся стабильность производителя (все из-за дамоклова меча NREC — нестабильный поставщик микроконтроллера, компонента сложного изделия, может создать ситуацию, при которой NREC станет совсем и никогда не возвращаемой); "распространенность", означающая хорошую инструментальную и информационную поддержку; энергетическая и производственная эффективность микроконтроллера (а именно, низкие энергопотребление и затраты на его применение в конечном изделии: создание печатной платы, монтаж, дополнительные компоненты и т. д.).

Итак, хоть по-настоящему перечень критериев куда более обширный, нам для "ознакомительного отбора" достаточно и приведенного.

Первым претендентом (хочется сказать — естественно) выступит архитектура i8031/32 во всевозможных ее классических, неоклассических и даже "постмодернистских" реализациях. Не будем пытаться перечислять компании, выпускающие совместимые с данной архитектурой микроконтроллеры, — занятие бесполезное. Диапазоны параметров представителей этого семейства впечатляющие: производительность варьируется от "стандартного" (определенного первыми реализациями Intel) миллиона "коротких" (задействующих только содержимое регистров) операций в секунду (далее — MIPS, но именно в указанном смысле) до сотен MIPS; степень интеграции — опять же от "стандартного" комплекта до встроенных декодеров MP3, полноценных Ethernet-контроллеров и расширенных банковых подсистем памяти; варианты исполнения — от пригодных к синтезу описаний на языках "проектирования железа" до бескорпусных чипов для установки на подложки гибридных микросхем и "многоногих монстров". Несмотря на относительную "древность" и кажущиеся серьезными угрозы со стороны других микроконтроллерных архитектур, этой, по-видимому, суждена еще очень долгая жизнь.

Возможно, секрет долголетия и неснижающейся популярности i8031/32 кроется в удачной программистской модели, может быть, в своевременности появления, удачном маркетинге и умной политике лицензирования — гадать не будем. К особенностям почти всего семейства следует отнести: полноценную гарвардскую архитектуру, позволяющую использовать одновременно до 64 KB памяти программ и до 64 KB данных, впрочем, не исключающую возможности эти памяти физически объединить (редкий и небезопасный "фокус", к которому иногда прибегают при построении контроллеров на основе ROMless-микросхем); банковую организацию рабочих регистров (4 банка по 8 регистров в каждом) и обеспечившую "расширяемость" семейства изначально избыточную область "регистров специальных функций". "Стандартно-минимальный" набор встроенной периферии включает в себя четыре "параллельных" 8-битных программируемых порта ввода/вывода (параллельных взято в кавычки, так как такие порты в микроконтроллерах можно использовать как угодно, поэтому лучше всего говорить, что у базовых контроллеров такой архитектуры "32 дискретных порта ввода/вывода"), два 16-битных таймера-счетчика и полностью дуплексный асинхронный последовательный порт (UART).

Все "периферийные" устройства "отображены" на регистры специальных функций, расположенные в соответствующей области блока отдельной встроенной памяти с произвольным доступом (IRAM — Internal RAM). В этом же блоке расположены регистровые банки и "сверхоперативная память". Для базовых моделей данная область специальных регистров блока заполнена всего на 20%, что на деле означает — для дополнительных периферийных устройств места "в архитектуре" более чем достаточно.

Восьмибитность микроконтроллеров этого семейства указывает, что все рабочие регистры имеют разрядность 8 бит. В свою очередь, значение адресуемой памяти команд свидетельствует, что счетчик команд (PC — Programm Counter) 16-битный. Для адресации памяти данных используется отдельный 16-битный регистр специальных функций DPTR ("указатель данных" — Data PoinTeR), который доступен и как пара 8-битных регистров. Упомянутые ранее регистровые банки переключаются установкой двух битов в особом регистре специальных функций — слове состояния программы (PSW — Program Status Word), что позволяет, например, быстро (если быть точным, в течение времени исполнения двух коротких команд) переключать контекст нескольких исполняемых программ без изменения состояния контроллера.

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

Претендентом номер два на краткое знакомство, с некоторыми сомнениями, можно назвать не менее "древнее" семейство архитектур PIC. Сомнения здесь ни в коем случае не связаны с их "недостатками" или качеством реализаций контроллеров. Скажем так, поставив PIC вторыми в списке (на самом деле здесь должны быть микроконтроллеры корпорации Motorola), пришлось все-таки немного пожертвовать инженерным прагматизмом в пользу "популярности в малосерийных разработках". В отличие от i8031/32, список производителей микроконтроллеров PIC-семейства невелик — в него входят компании Microchip и Ubicom. Впрочем, это ни в коей мере не ограничивает спектр выпускаемых компаниями моделей.

PIC являются представителями класса "чистых RISC"-машин. Такие вычислители характеризуются, в первую очередь, сочетанием гарвардской архитектуры и отличающимися разрядностями данных и команд. Последнее свойство исключительно важное — увеличенная разрядность команды позволяет "упаковать" в нее и код команды, и, например, операнд. В целом же сочетание формирует благоприятную почву для реализации конвейерной обработки и системы команд, ориентированной на однотактное исполнение. Эти особенности характерны для всех представителей семейства PIC. Кроме них, PIC демонстрирует еще один сугубо микроконтроллерный архитектурный прием — аппаратный стек. В универсальных процессорах стек обычно организуется в основной оперативной памяти. Для микроконтроллеров RAM — весьма дорогой ресурс (динамическая память здесь используется нечасто из-за жестких требований к энергопотреблению, а статическая — занимает слишком много места на кристалле ввиду многотранзисторной реализации ячейки), поэтому вынесение стека в отдельную замкнутую подсистему, объединяющую регистр-указатель стека (SP — Stack Pointer) и ограниченное количество ячеек памяти, — прием обычный. Кроме того, "сугубо микроконтроллерным" свойством PIC-семейства можно считать "регистровую сверхнасыщенность", на деле означающую, что память данных в этой архитектуре является множеством регистров с банковой организацией (здесь также "работает" уже известная терминология: регистры специальных функций SFR, на которые, в частности, "отображается периферия").

Претендент номер три — семейство контроллеров Atmel AVR. Как и PIC, это "чистый RISC" во всех отношениях (гарвардская архитектура, 16-битная команда и 8-битные регистры. Как и в PIC, здесь реализован конвейер (пока текущая команда выполняется, следующая выбирается из памяти). Но на этом сходство заканчивается. Главное отличие заключается в организации памяти данных — в AVR-семействе обошлись без "выкрутасов" с банковой организацией (как в PIC) или выделения "сверхоперативной памяти" в отдельное пространство (как в i8031/32). Здесь все проще: и регистры общего назначения, и аналоги регистров специальных функций, и оперативная память находятся в одном адресном пространстве. Такой "прямолинейный характер" программистской модели, дополненный отличной системой команд и "однотактным" их исполнением, делают AVR почти идеальным для программирования не на ассемблере, а на языках высокого уровня (хотя кросс-трансляторы существуют, естественно, для всех перечисленных архитектур).

Микроконтроллеры семейств Motorola HC0x — совсем иная история. Если i8031/32 — "не то CISC, не то RISC" (особенно в современных "скорострельных" реализациях), PIC и AVR — "чистый канонический RISC", то HC0x — это классика CISC. Никакой "регистровой насыщенности", всего один рабочий регистр — аккумулятор, фон-неймановская архитектура, никаких банков памяти — линейно адресуемая память программ/данных, никаких "аппаратных стеков", однотактного исполнения команд, периферия "отображена" не на регистры, а на ячейки памяти. И между тем, все это не мешает HC0x быть одним из самых востребованных микроконтроллерных семейств "классическими" индустриями (в первую очередь, автомобильной). Простота вычислителя здесь — гарантия простоты разработки весьма неплохих оптимизирующих компиляторов, а проектирование на языке высокого уровня становится и в микроконтроллерной области доминирующим.

Зачем и с чего начинать

Действительно, зачем возиться с 8-битными "жуками", если под рукой имеется более чем мощный ПК? Ответов может быть несколько, например: хотя бы потому, что это интересно. Ограниченные ресурсы и четко определенные задачи — свойства всей области, называемой embedded (встраиваемые системы), для которой контроллеры — основной вычислительный инструмент. Поэтому здесь есть простор для высококлассного программирования в "чистом виде", практически на уровне знаменитых книг Д. Кнута "Искусство программирования". Но это только вид "интересности" с одной стороны. Вторая определяется жесткими требованиями к качеству, потому никакого "хакинга", а только жесткая дисциплина, отличное знание всех нюансов целевой платформы, разумное и грамотное применение инструментальных средств. Чувствуете, что кроется за этим перечнем? То, что называется "высший пилотаж". А мастера "высшего пилотажа", понятно, невостребованы не бывают.

Как уже говорилось ранее, стартовой платформой разумнее всего выбрать любого представителя
семейства i8031/32. Подобные микросхемы, особенно "древние" (никакой
существенной разницы в дате выпуска для начинающего изучение нет), и ROMless на
радиорынках стоят буквально копейки. Стремиться за "модностью" используемых
компонентов на этапе освоения азов совершенно излишне. Найти документацию на практически
любой чип можно без проблем с помощью Google. Вооружитесь довольно неплохой книгой
"Последнее слово о 8051" (The Final Word on the 8051, доступна в онлайн-
и офлайн-версии на сайте www.fe.up.pt/~ee99043/8051/),
кросс-ассемблером ASEM-51 (plit.de/asem-51/final13.htm,
версии для ОС MS-DOS, MS Windows и Linux), кросс-транслятором с языка С SDCC (sdcc.
sourceforge.net
, для производственных целей он малопригоден, но в качестве
"учебной парты" весьма хорош в силу бесплатности). На начальном этапе
не помешает программный симулятор некоммерческого качества Jsim
— бесплатный и вполне "съедобный". Любители интегрированных сред разработки
могут "повозиться" с бесплатным для некоммерческого применения "комбайном"
компании Riegel,
объединяющим в себе и транслятор с подмножества языка С, и ассемблер, и программу-симулятор
целевого процессора. Впрочем, данный перечень, весьма далекий от полноты, вы можете
сами расширить, набрав в Google строку "8051 +”development tools” +freeware".

Начинать изучение микроконтроллера целесообразно с общего ознакомления с архитектурой,
т. е. с видения "железа" программистом. Затем надо выяснить для себя
все тонкости инициализации "машины": что происходит с ней после включения,
в каком состоянии оказываются все подсистемы, что нуждается в принудительной инициализации
со стороны программиста. По ходу узнавания здесь можно и нужно кратко ознакомиться
с "периферийными" устройствами, пока не вдаваясь в детали. Для изучения
системы команд обычно достаточно программного симулятора и описания из документации.
Эти три базовых этапа соответствуют, скажем так, подготовке по курсу "виртуальные
взлет-посадка". Для дальнейшего продвижения и постижения порой весьма забавных
нюансов реальных микроконтроллеров понадобится реальное "железо". Разнообразных
проектов с использованием чипов выбранного семейства в Сети множество, но из них
выделяется "дешевая плата для разработки" Пауля Штоффрегена (Paul
Stoffregen
) — продуманностью, возможностями и большим количеством удачных
повторений. Она достаточно сложна на вид, но на деле не содержит никаких дефицитных
по нынешним временам компонентов и собирается (при начальных радиолюбительских
навыках) буквально за один выходной день.

Ни в коем случае не следует думать, что i8031/32 — единственная удачная стартовая
платформа. Вероятнее всего, если вы начнете освоение с PIC или AVR, вам будет
даже намного проще — для микроконтроллеров этих семейств есть распространяемые
производителями бесплатные среды разработки (ограниченные, правда, языком ассемблера)
MPLAB и AVR
Studio
. Многократно программируемые версии контроллеров обоих семейств более
чем доступны по цене, схемы программаторов для них — примитивны. Но имеется одно
"но", оправдывающее "древнюю" архитектуру i8031/32 в качестве
стартовой, — она действительно настолько "ни рыба, ни мясо" (ни CISC,
ни RISC), настолько распространена и популярна, что оказала колоссальное влияние
на своих последователей-конкурентов. Так что все усилия по ее изучению окупятся
сторицей — тяжело в ученье…

Disqus Comments Loading...