Автор: Юрий Ревич
В 2007 году мировой рынок полупроводников оценивался в 273 млрд. долларов. Не менее 40 млрд. из них приходится на долю микропроцессоров (МП) для персональных компьютеров. А отдельной статьей идет производство микроконтроллеров (МК), которое составляет в стоимостном выражении около трети от производства МП - примерно 14 млрд.
Если учесть, что "средний" МП стоит десятки долларов, а МК - около одного доллара, нетрудно сделать вывод о решительном преобладании МК над МП в количественном отношении. Точно подсчитать соотношение выпускаемых микросхем в штуках довольно сложно (ежегодно во всем мире выпускается около 600 млрд. полупроводниковых микросхем), но по данным 2002-03 года, лишь 6% всех выпускаемых процессоров составляли привычные нам процессоры для ПК.
Основное различие между МП и МК можно провести по назначению: первые применяются в основном как центральное вычислительное ядро, оставляя функции общения с внешним миром на периферийные компоненты. МК же используются в основном для управления другими устройствами, потому собственно вычислительная мощность у них может быть невелика[1 Хотя это еще как сказать: например, современные 8-разрядные МК семейства AVR Mega заметно превышают по вычислительной мощности 16-разрядный процессор i286, служивший основой IBM PC AT в середине 80-х.], а встроенные функции "общения", наоборот, расширены. Назвать общее количество семейств МК, выпускаемых в мире, затруднительно: с уверенностью можно только сказать, что их существенно больше ста. Подсчет затрудняется тем, что грань между МК и МП размыта: так, ARM-архитектуру можно отнести и к сектору МП, и к сектору МК, а знаменитый i386, представляющий собой типичный МП, до сих пор производится для употребления в промышленных контроллерах.
Примерно 50% рынка МК составляют 8-разрядные чипы, хотя самый быстрорастущий сектор - 32-разрядные, в основном на архитектуре ARM, ставшие основой для различных мобильных устройств. Как ни удивительно, около 10% рынка до сих пор имеют 4-разрядные - ближайшие родственники знаменитого i4004, первого микропроцессора в истории, выпущенного Intel еще в 1971 году.
В 1976 году Intel выпустила i8048, 8-разрядный процессор, считающийся первым микроконтроллером в истории (он был, в частности, использован в клавиатуре первых IBM PC). Он имел все базовые узлы, характерные для современных МК: кроме АЛУ, это три параллельных порта ввода-вывода, таймер-счетчик, систему внутренних и внешних прерываний, 64-байтное ОЗУ данных и встроенную память программ в 1 кбайт (расширяемую внешними ПЗУ до 4 кбайт). Texas Instruments оспаривает у Intel первенство, утверждая, что первым МК был выпущенный в 1972 году 4-pазpядный TMS1000. Однако возможности этого чипа были значительно беднее.
Классикой жанра стал чип 8051, выпущенный Intel в 1980 году. События, связанные с появлением в 1981 году IBM PC на основе интеловского же процессора 8086/88, обычно заслоняют в сознании историков этот факт. Но для электронной индустрии в целом архитектура x51 сыграла примерно такую же роль, как х86 в секторе ПК, если не большую. Достаточно сказать, что x51-совместимые МК безусловно доминировали в индустрии пятнадцать лет, до середины 1990-х, и в настоящее время (когда сама Intel уже давно отказалась от их поддержки) все еще занимают не менее трети рынка универсальных МК. Контроллеры на основе этой архитектуры сейчас выпускают более полутора десятков фирм, среди которых Texas Instruments, Atmel, NXP (Philips Semiconductor), Infineon (Siemens), OKI, NEC и др.
Лидирует в мире по выпуску МК фирма Motorola, но ее продукция всегда была в большей степени рассчитана на корпоративных заказчиков, и в отечественных магазинах "Чип и Дип" ее контроллеров вы, скорее всего, не встретите. Хотя, кроме широкого спектра специализированных и "заказных" МК, Motorola выпускает и универсальные (68HC05, 68HC08, 68HC11), фирма долго не предоставляла средств, облегчающих освоение ее продукции, и потому в нашей стране она непопулярна.
Огромное количество МК производится под конкретную задачу: это, например, контроллеры дисплеев, электродвигателей, зарядных устройств для аккумуляторов, и пр. Сюда же можно отнести и так называемые DSP - Digital Signal Processor, специальные контроллеры для скоростного аналого-цифрового преобразования и различной обработки аналоговых сигналов. В принципе, DSP составляют особый и очень важный класс полупроводниковых приборов, и мы о них поговорим как-нибудь отдельно.
Для решения общих задач выпускают универсальные МК, которые отличаются наличием развитой встроенной периферии - это то самое, что называется computer-on-chip, однокристальный компьютер. Если любой процессор для ПК, начиная с i8086 и заканчивая последними двух-четырехъядерными моделями, без внешнего чипсета абсолютно беспомощен, то универсальный МК содержит в себе все функциональные узлы, необходимые для полноценной работы. На таком МК в принципе можно построить работающий компьютер с добавлением лишь клавиатуры и дисплея, без каких-либо других существенных компонентов.
Принадлежность к тому или иному семейству характеризуется ядром, главная из характеристик которого, естественно, разрядность. Тем не менее существуют, например, совместимые 16-разрядные версии 8-разрядных процессоров (чему начало положила, несомненно, Intel со своими 8086/88). Кроме разрядности, ядро характеризуется архитектурой. Абсолютно универсальных архитектур, естественно, не бывает, и хотя в принципе все универсальные МК могут делать одно и то же, архитектурные войны среди микроконтроллерщиков кипят ничуть не с меньшим накалом, чем среди приверженцев Windows/Linux или ATI/nVidia. Как и в этих случаях, войны являются уделом в основном любителей: но и профессионалы нередко питают слабость к той или иной конкретной архитектуре. В отношении МК положение облегчается тем, что для пользователя конечной продукции (а в принципе даже и для самого разработчика) выбор той или иной архитектуры по большей части не имеет ровным счетом никакого значения, и влияния на конечный результат не оказывает. А такие системы, как универсальная среда Embedded Workbench фирмы IAR Systems для программирования на языке С более чем двадцати семейств МК, вообще сводят различия к минимуму (см. врезку).
Все универсальные 8-разрядные МК содержат в разных вариантах примерно один и тот же набор встроенных периферийных модулей: это 8-ми и 16-разрядные счетчики-таймеры; параллельные порты ввода-вывода (с индивидуальным управлением каждым выводом); последовательные порты UART, SPI, иногда двухпроводный I2C; аналогово-цифровые преобразователи (рис. 1). Все современные МК могут функционировать в режиме ожидания с пониженным (до нескольких мкА) энергопотреблением.
Большинство МК имеет гарвардскую (а не фоннеймановскую, как у "обычных" компьютеров) архитектуру памяти, когда области хранения программ и данных разделены (исключения все же есть - например, некоторые МК фирмы Fujitsu). Такое построение вытекает из самого принципа устройства МК, где программы обычно хранятся в энергонезависимой памяти (ранее - в "прожигаемой", либо УФ-стираемой, сейчас около трех четвертей рынка занимают контроллеры с флэш-памятью), тогда, как данные - в быстродействующей SRAM, которая иногда может наращиваться с помощью внешних модулей. Для долговременного хранения данных в МК обычно встраивают отдельный небольшой массив EEPROM-ячеек или применяют внешние ППЗУ.
Однако различия между семействами все же имеются, и при построении систем их приходится учитывать. Давайте рассмотрим подробнее универсальные МК на примере трех наиболее популярных семейств - это упоминавшийся x51, и кроме того, PIC фирмы Microchip и AVR фирмы Atmel.
Патриарх i8051 совершил в свое время переворот прежде всего тем, что это был первый computer-on-chip, содержащий на кристалле практически все, что требуется для автономного функционирования: встроенную память программ, четыре восьмиразрядных параллельных порта ввода-вывода, два 16-разрядных таймера-счетчика, универсальный последовательный интерфейс, и систему внутренних и внешних прерываний. В дальнейшем он породил большое число подражаний самого разнообразной структуры и назначения; в том числе выпускались (а может, даже и продолжают выпускаться - в продаже, во всяком случае, имеются) его клоны и в нашей стране в виде серий 1816 и 1830.
Система команд x51 основана на работе АЛУ с единственным регистром-аккумулятором, плюс еще один вспомогательный регистр, который штатно используется для команд аппаратного умножения и деления, но годится и для хранения какой-нибудь переменной. Такая конструкция подразумевает широкое использование стека. Для программных переменных предполагается расположение в памяти данных, которая может иметь самую разнообразную конфигурацию (если учесть возможность подключения внешней памяти до 64 кбайт), поэтому в архитектуре х51 имеется огромное количество однотипных инструкций, различающихся только способом адресации.
Хотя все МК x51 давно делаются по КМОП-технологии, с электрической точки зрения все выходные линии портов х51 совместимы с TTL-уровнями, и часть из них имеет выходы с "открытым коллектором". Достоинством архитектуры может считаться наличие упомянутых аппаратных инструкций умножения и деления и важной для электронных устройств операции десятичной коррекции. Однако канонический х51 имеет один крупнейший недостаток: длительность выполнения команд у него кратна машинному циклу, который занимает целых 12 тактов. Т. е. устройство с тактовой частотой 12 МГц будет иметь быстродействие всего 1 миллион простых инструкций в секунду (MIPS). Значительное число более современных модификаций х51 может выполнять инструкции быстрее: для примера можно привести серию фирмы Atmel под названием 89LP, где машинный цикл равен всего одному такту.
В отличие от x51, имеющих CISC-подобную архитектуру, МК семейства PIC фирмы Microchip, впервые появившиеся в конце 1980-х годов, имеют RISC-архитектуру с действительно "сокращенным набором команд": их всего 33-35 штук. Команда здесь выполняется за 4 такта, а не за 12, в архитектуре имеется набор оперативных регистров, позволяющих хранить переменные без обращения к памяти (правда, без регистра-аккумулятора тут не обошлось). В PIC-контроллерах впервые были опробованы такие инновации, как встроенное многоканальное АЦП, широкий диапазон напряжения питания (от 2 В), ШИМ-режим работы таймера (который годится, например, для синтеза звука или управления шаговыми двигателями) и прочие штучки, которые ныне уже стали стандартными для универсальных контроллеров.
Электрически порты PIC совместимы с портами х51. В принципе архитектура PIC (пусть на меня ее приверженцы не обижаются) есть довольно половинчатая и компромиссная попытка улучшить архитектуру х51: так, ревностное следование концепции RISC в микроконтроллерах совершенно необязательно и набором всего из 33 команд пользоваться не всегда удобно. Но PIC появились крайне вовремя, когда кроме штампованных клонов 8051 и его предшественника 8048, по сути, никто ничего не предлагал. По этой причине (а также из-за демократической торговой и ценовой политики Microchip) "пики" и сейчас занимают не менее 14% такого консервативного рынка, как производство 8-разрядных МК.
Фирма Atmel сыграла в электронной промышленности роль, в некотором роде сравнимую с ролью Apple в производстве ПК: она не находится на первых ролях, но всегда отличалась передовыми инновациями. Сейчас на рынке 8-разрядных МК она имеет около 6%. Фирму основал в начале 1980-х Джордж Перлегос, известный тем, что руководил в Intel направлением энергонезависимой памяти: при его непосредственном участии были разработаны первые типы электрически стираемых кристаллов EEPROM. В 80-е годы Atmel попыталась занять ведущее место на этом быстрорастущем рынке, и остается до сих пор одним из ведущих производителей flash- и EEPROM-чипов для установки в схемы различных устройств (например, нередко можно встретить Flash BIOS на чипах Atmel).
В конце 1980 х Atmel в числе других оказалась втянута в патентные разборки с энергонезависимой памятью, инициированные Intel, из которых вышла даже с некоторой прибылью, оказавшись обладателем лицензии на производство х51-совместимых МК, в каковой области и поныне является одной из ведущих. В 1993 году Atmel стала инициатором переворота в отрасли, начав производство МК AT89C51 со встроенной flash-памятью программ, что оказалось значительно удобнее одноразовых "прожигаемых" кристаллов или УФ-стираемых, требующих длительной "ручной" процедуры очистки.
В 1995 году два норвежских студента из г. Тронхейма, Альф Боген и Вегард Воллен, выдвинули идею 8-разрядного RISC-ядра, которую предложили руководству Atmel. Ядро это, названное AVR по именам разработчиков (Alf - Vergard - RISC), было разработано без оглядок на существовавшие решения, и вполне заслуживает название революционного. В AVR-ядре типовые инструкции выполняются за один такт, причем в обеспечение этого имеется элементарный конвейер с одновременным выполнением инструкции и выборкой следующей (потому команды ветвления выполняются за два такта - конвейер "тупо" полагает, что условие ветвления не выполнится). Первоначальное ядро состояло всего из 32 тысяч транзисторов.
В работе над ядром приняла участие упоминавшаяся фирма IAR System, разработчик С-компиляторов. Возможно, поэтому главной особенностью AVR стал решительный разрыв с характерными для существовавших ранее архитектур с инструкциями, выполнявшимися через специальный регистр-аккумулятор: большинство команд здесь может непосредственно оперировать с регистрами общего назначения (которых имеется аж 32 штуки), в ряде случаев вообще не нуждаясь в обращении к ОЗУ. Потому структура ассемблерных программ для AVR стала подозрительно напоминать программы на языке высокого уровня, где операторы работают не с ячейками памяти и регистрами, а с абстрактными переменными и константами. Мало того, в ряде младших моделей нельзя даже напрямую работать со стеком - для программы он при таком количестве регистров-переменных оказывается попросту ненужным, и используется лишь аппаратно при вызове подпрограмм.
Сделать шажок к переходу от ассемблера на С при такой архитектуре значительно проще: фактически оставалось лишь упаковать то, что знаменитый программист Дейкстра назвал "лапшой условных и безусловных переходов", в привычные циклы с предусловием/постусловием или операторы выбора. Именно по этим причинам архитектура AVR считается наиболее приспособленной к программированию на С.
Причем различные способы адресации, имеющие такое важное значение в архитектуре х51, здесь разбросаны по совершенно разным командам, и программист вообще может не изучать соответствующий раздел инструкции. Количество команд в архитектуре AVR довольно большое, 120-130 штук, но противоречия с RISC-концепцией здесь нет - 30-40% команд есть лишь псевдонимы, введенные для удобства программиста. Причем инструкций деления и умножения, в полном соответствии с RISC-концепцией, канонический AVR не предусматривает: лишь позднее для более "продвинутых" моделей появилась возможность аппаратного умножения.
Другим большим плюсом AVR стал впервые введенный последовательный интерфейс занесения программы в память кристалла, благодаря чему МК стало можно программировать прямо в готовой схеме, без каких-либо специальных программаторов: в принципе достаточно чисто софтверного решения на ПК, соединяющегося через LPT со схемой пятью проводочками. Не стоит и говорить, что из-за подобной фичи AVR снискали себе горячую любовь отечественных (и не только) радиолюбителей. Позднее таким интерфейсом были вынуждены обзавестись и другие популярные семейства МК.
К недостаткам AVR можно отчасти отнести то, что электрически выводы портов по уровням сигналов являются КМОП-совместимыми: это повышает помехоустойчивость (порог различения низкого-высокого уровня лежит в районе середины питания, а не ближе к нулю, как у х51), но вызывает ряд проблем (вполне, впрочем, решаемых) совместимости с различными стандартными интерфейсами. Не очень логично и построение некоторых команд в области операций с битами. Но в целом архитектура AVR, несомненно, более прогрессивна и если бы в этой отрасли моды менялись так же быстро, как это происходит в области ПК, то AVR имела бы все шансы на первенство.
По счастью, отрасль производства МК гораздо более консервативна: в рекламе стиральной машины не запишешь, что она построен на "новейшем 32-разрядном чипе", и никого по большому счету не волнует, какую архитектуру предпочитает разработчик данного бытового устройства. Потому у инженера оказывается значительно больше свободы применять то, что ему привычно и нравится, и меньше зависимости от рекламных веяний и монополизма производителей платформ. В области МК исключена ситуация, когда кто-то впаривает недоработанный и неудобный стандарт, пользуясь своим положением на рынке: разработчики просто пожмут плечами и отвернутся к другому производителю, или будут продолжать применять то, что применяли издавна. И это несомненный плюс отрасли, который в конечном итоге играет на руку потребителям, удешевляя и упрощая конечные устройства.
Это вопрос в отношении программирования МК имеет совершенно иной оттенок, нежели идиотские споры "писишников" 1980-х годов (сейчас, правда, давно забытые). Культура программирования МК и ПК различается, как небо и земля. Инженер, работающий с МК, всегда в большей степени электронщик, чем программист: для него программа не самоцель, а средство заставить систему работать. В программах для МК, например, вполне допустимо то, что в случае однозадачной DOS запросто повесит весь компьютер и для "писишников" служит признаком профнепригодности: ожидание события в бесконечном цикле без возможности его прервать. Между тем в системах на МК сам факт, что событие не состоялось, нередко означает неисправность всего устройства, и в таком случае бывает совершенно безразлично, зациклится программа или нет.
Подобные особенности программирования МК делают, в общем, не слишком актуальным вопрос о том, как программист добивается своих целей. Правда, память программ в МК исчисляется килобайтами, а скорость работы их не очень-то велика, и потому тут на первый план нередко выходят соображения компактности кода или скорости выполнения процедур: нередко специально составляются библиотеки подпрограмм, оптимизированные либо по количеству команд, либо по времени выполнения - смотря, что важнее. В общем случае, разумеется, программы, написанные на С, дают менее компактный код (даже для AVR, система команд которой специально оптимизирована для программирования на С), и это стоит учитывать.
Если речь идет о программах для простых и малотиражных устройств, где количество строк кода не превышает сотен, а стоимость разработки является определяющей, то ассемблер оказывается целесообразнее, чем С. При этом следует учесть, что инженеру без специальной программистской подготовки, рассуждающему в терминах регистров и ячеек памяти, ассемблер дастся легче, чем С, который с его надуманной нотацией еще требуется специально изучать. Добавим еще, что стоимость IAR Embedded Workbench, наиболее популярной среды программирования на С, находится в диапазоне килобаксов, а ассемблер бесплатен (для некоторых разновидностей МК есть, правда, "опенсорсный" компилятор GCC). Тем не менее, профессиональный подход в области МК все же подразумевает использование С, и стандартных библиотек на этом языке значительно больше, чем на ассемблере. Язык С позволяет легче переходить с одного МК на другой, а программы, содержащие более нескольких тысяч команд, на ассемблере писать и отлаживать настолько тяжело, что тут уже не до компактности кода.