Микропроцессоры – сравнительные жизнеописания (почти по Плутарху)

     Как и было обещано в первой части статьи ("Компьютерное Обозрение", # 33, 1999), настало время рассказать об одном из САМЫХ-САМЫХ процессоров Intel. Собственно говоря, 8051 — микроконтроллер (функционально завершенное однокристальное изделие, объединяющее процессор, оперативную и постоянную память, а также ряд необходимых "периферийных" устройств), поэтому его появление в обзоре, посвященном микропроцессорам, может показаться несколько странным. Не пытаясь оправдываться, могу привести следующие аргументы в пользу крайней необходимости выделения почетного места для 8051 в этом условном микропроцессорном пантеоне: во-первых, существует "чистый процессор" 8031, не имеющий на кристалле памяти программ (или ПЗУ), во-вторых… просто это один из любимых автором процессоров.

     Эксцентричным 8051 был назван в предыдущей части статьи совершенно не случайно — архитектурные решения, заложенные в него конструкторами, абсолютно не соответствуют расхожим представлениям об Intel как о компании, "выпускающей Пентиумы". Если все рассмотренные в первой части статьи CPU относились к обширному классу "машин с единой памятью команд и данных", то 8051 — первый субъект "чистой гарвардской архитектуры". Главное отличие "гарвардских машин" — разделение памяти команд и данных (на всех аппаратных уровнях — шин, микросхем памяти и т. д.), позволяет существенно повысить скорость вычислений, допуская одновременную выборку кода команды и сопутствующих этой команде данных. Более традиционные процессоры вынуждены выполнять эту процедуру последовательно. Сегодня "гарвардским духом", конечно, никого не удивишь, но и у 8051 это не единственная изюминка…

     Регистровая архитектура "пятьдесят первой" (рис. 1) позволяет взглянуть на Intel по-новому: здесь есть все (или почти все) — необходимый для гибкой адресации и быстрого выполнения арифметических команд блок базовых регистров, четыре банка регистров (по 8 в каждом) с гибкими способами переключения, совершенно уникальная область "битового процессора" и, наконец, ОЗУ емкостью 80 байтов для пользовательских переменных и стека. Регистровые банки 8051 очень напоминают более новомодные регистровые окна во "взрослых" RISC-процессорах, что, несомненно, сказалось на формировании развитой техники программирования 8051-совместимых процессоров: вероятнее всего, ни для одного 8-битового CPU (за исключением Z80) не существует такого разнообразия технологических программных пакетов (компиляторов с языков высокого уровня, операционных систем реального времени). Битовый процессор 8051 представляет собой 16-байтовую область памяти, каждый бит которой имеет уникальный адрес, позволяющий с помощью ряда команд выполнять быстрые операции над отдельными битами многоразрядных слов. Этот элемент архитектуры — "главный виновник" неувядающей популярности 8051: во-первых, ни в одном процессоре ничего подобного не существует, во-вторых, быстрые битовые операции — основа основ самых разнообразных программ из "реальной жизни" — управляющих, коммуникационных и вычислительных.

     Блок базовых регистров включает привычный 16-битовый счетчик команд (PC), два 8-битовых аккумулятора (A и B, поддерживающих аппаратные команды умножения и деления), 8-битовый указатель стека (SP) и "длинный" (16-битовый) индексный регистр памяти данных. Фактически блок базовых регистров 8051 представляет собой основу достаточно функционального микропроцессора, позволяющего на "все сто" использовать до 128 KB памяти (по 64 KB для памяти программ и данных).

     Система команд и пять способов адресации данных и команд дают программисту довольно мощные механизмы и отлично подходят для разработки компиляторов с языков высокого уровня. Кажущаяся "миниатюрность" 80-байтового ОЗУ на деле обеспечивает достаточное пространство для реализации даже таких сложных алгоритмов, как, например, стек TCP/IP.

     Аппаратные интерфейсы всех представителей семейства "x51" очень удобны (малое число выводов, простые и подходящие для реализации малосерийных изделий небольшими производителями корпуса микросхем) — все это изрядно "подливает масла в огонь" негаснущего костра популярности 8051.

     Сегодняшнее состояние пятьдесят первого семейства убедительно доказывает, что эти процессоры, пережившие ушедшие в прошлое 80386 и 80486, вероятнее всего, переживут и Pentium III… По крайней мере, сама Intel продолжает их выпускать и совершенствовать, Philips на основе процессорного ядра 8051 производит несколько десятков самых разных микроконтроллеров, Dallas Semiconductor славится "реактивными" версиями "пятьдесят первых", у которых эквивалентная тактовая частота (по сравнению со "стандартной" intel 8051) составляет… 99 MHz, Standard Micro (SMC) интегрировала в одной микросхеме для индустриальных потребителей ядро 8051 и полный контроллер сети Arcnet, Analog Devices расширила возможности также ускоренной 8051 чуть ли не до уровня цифрового сигнального процессора. А свидетельством неистребимого интереса разработчиков к этому маленькому шедевру Intel являются самые разнообразные Internet-форумы, посвященные 8051, — по крайней мере, один из них, спонсируемый Philips, своими рассылками способен очень быстро "забить до отказа" несколько сотен мегабайтов винчестера…

     Самые маленькие RISC

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

     Несмотря на то что отличительные черты хорошего RISC-процессора никем не определены, есть ряд соображений, позволяющих найти ту тонкую грань, которая отделяет RISC от всего остального. Компактная система команд, ориентированная на выполнение всех операций исключительно над содержимым регистров процессора (например, команда сложения содержимого регистра и ячейки оперативной памяти плохо согласуется с RISC-идеологией), очевидно нуждается в очень эффективной шинной архитектуре и быстродействующем ОЗУ. Подобным требованиям прекрасно соответствует гарвардская архитектура (отдельная память команд и данных). Кроме того, возрастающее количество простых команд, необходимых для выполнения того или иного высокоуровневого действия (иначе говоря, операции на языке высокого уровня), вынуждает для достижения приемлемого быстродействия сокращать время выполнения одной машинной команды — в идеале до одного периода тактовой частоты. Соответственно команды должны быть очень короткими (т. е. читаться из памяти "за один прием"). Но как быть с такими важными операциями, как вызовы подпрограмм и условные переходы, — ведь в машинном представлении они должны содержать адрес, изменяющий "поток инструкций"? Вот здесь и кроется та самая малозаметная "грань" — хороший и "настоящий" RISC-процессор должен быть основан на гарвардской архитектуре с различной разрядностью памяти данных и памяти команд (команда длиннее данных). В этом случае в команду можно "упаковать" или непосредственные данные (как, например, в команде "загрузить в регистр N число 232"), или адрес ("перейти к выполнению команды, находящейся в ОЗУ по адресу 12567").

     Существует несколько десятков различных микропроцессоров/контроллеров, обладающих этими ярко выраженными признаками, и все уважающие себя производители чипов обязательно имеют в своем арсенале что-либо подобное. Но так уж получилось, что массовое признание завоевали процессоры семейства PIC (Microchip) и AVR (Atmel). Заслуживающим более детального рассмотрения, на взгляд автора, все-таки является AVR-семейство процессоров (по крайней мере, эти чипы обладают всеми признаками полнофункциональных и расширяемых микрокомпьютеров).

     Микропроцессорное ядро Atmel AVR — пожалуй, самое простое, лишенное всяческих причуд и очень удобное для программирования. Его разработчики, в отличие от любящей погреться под калифорнийским солнцем корпорации Atmel, находятся в куда более суровом климате Норвегии (вот еще один хороший пример, как можно производить микросхемы, не имея полупроводникового производства). Знаменитые скандинавские невозмутимость и спокойствие буквально ощущаются в AVR — "просто, добротно, надежно, хорошо". Правда, при этом по-американски быстро.

     Регистровая архитектура AVR включает достаточное для большинства приложений число 8-битовых регистров (32), 16-битовый счетчик команд (PC) и 16-битовый указатель стека (SP). Большая разрядность команды (16 битов) позволила реализовать очень мощный набор "коротких" (требующих одного обращения к памяти) инструкций и обеспечить высокую производительность — до 8 MOPS (миллионов операций в секунду). Характерная особенность AVR — чрезвычайно развитые способы адресации данных, поддерживающиеся возможностью использования трех пар регистров (X, Y, Z на рис. 2) в качестве индексных указателей. По числу способов адресации AVR уступает разве что только куда более мощным и проверенным временем классическим CISC-процессорам Motorola.
     

     Монстры

     От восьмибитовых "малышей"-тружеников приходится сразу переходить к очень сложным многоразрядным процессорам. Промежуточная "ветвь" эволюции — 16-битовые вычислители — фактически оказалась тупиковой, и достойных представителей немногочисленного 16-разрядного племени найти очень и очень трудно (существуют, правда, модификации микропроцессора 8051 с повышенной до 16 бит разрядностью, но сравнимой со своим предшественником популярности они не получили). С современной точки зрения "гром" перехода к 32-битовым архитектурам грянул с выходом в сентябре 1979 г. процессора Motorola M68000, первого в семействе 680×0, заслуженно названного "мэйнфреймом на кристалле": хоть и были 32-разрядные процессоры, появившиеся раньше (например, Zilog Z8000), но их роль оказалась слишком незначительной…

     Итак, Motorola 68000. Об этом процессоре можно писать многотомные книги, и все равно что-нибудь обязательно останется "за бортом". Смешная по сегодняшним меркам степень интеграции (всего 69 тыс. транзисторов), невысокое быстродействие (тактовая частота до 20 MHz) — казалось бы, в современном мире этим чипам найти место очень трудно. Но очевидные, на первый взгляд, вещи обязательно таят в себе какой-нибудь подвох. Как только речь заходит об очень сложных системах, критичных к надежности, семейство 680×0 всегда на первых местах. В качестве примера можно привести один из самых дорогих военных проектов США — атомную подводную лодку Seawolf SSN21 стоимостью свыше 1 млрд. долл. Боевое управление подсистемами лодки, способной погружаться на глубину до 610 м, двигаться в погруженном состоянии со скоростью 35 морских миль (почти 65 км/ч) и оснащенной атомным реактором мощностью 52 тыс. лошадиных сил, доверено распределенной вычислительной системе, содержащей свыше 70 процессоров M68030 (максимальная тактовая частота которых не превышает 50 MHz, а производительность — 18 MIPS). Заподозрить американский ВПК в чрезмерной склонности к экономии трудно, тогда чем же можно объяснить подобный выбор — ведь проект Seawolf начинался в 1989 г., а первые лодки сошли со стапелей аж в 1997-м — в годы расцвета мощных и дешевых процессоров x86-архитектуры и сверхпроизводительных, относительно недорогих RISC?

     Вероятнее всего, что ответ на этот вопрос кроется именно в особенностях "мотороловских" процессоров и, в первую очередь, в объекте нашего рассмотрения — M68000. Появившийся несколько позже i8086, M68000 был ощутимо дороже и разительно отличался от выбранного IBM в качестве основного процессора первой PC. Начну с того, что M68000 — действительно 32-разрядный процессор, с целью экономии оснащенный сокращенными внешними шинами: 24-битовой — адреса и 16-битовой — данных. В 1979 г. микросхемы были очень дорогими, и подобная политика способствовала продвижению процессоров с "урезанными" шинами на рынке, снижая стоимость реализации систем на их основе за счет как сокращения количества чипов в завершенной системе, так и возможности использования в качестве микросхем расширения уже хорошо проработанных, массовых и недорогих чипов, специально созданных для 8-битовых систем. Несмотря на такую "привязанность" к быстро дешевеющему прошлому, разработчики Motorola нашли и реализовали множество возможностей нацелить процессор в будущее. В отличие от самого серьезного конкурента (8086 от Intel) M68000 поддерживал и линейное несегментированное адресное пространство, и два режима работы (пользовательский и операционной системы, иначе называемый суперпользовательским), и аппаратные интерфейсы с потенциально ненадежной периферией, и, наконец, ориентированные на мультипроцессорные приложения аппаратные особенности.

     Регистровая архитектура M68000 (рис. 3) — классический образец мощной вычислительной машины со сложным набором команд: две группы 32-битовых регистров общего назначения, разделяющиеся "по специализации" (восемь регистров "данных", семь — "адресов"), два 32-битовых регистра указателей стека (один — пользовательского, второй — суперпользовательского режимов, на рис. 3 — USP/A7 и SSP соответственно) и 32-битовый счетчик команд PC. Система команд 68000, можно сказать, включает все — программирование этого процессора на ассемблере больше напоминает работу с высокоуровневыми языками (правда, не балующими простотой синтаксиса).

     Базовая система команд насчитывает всего 56 инструкций (по крайней мере, это чуть ли не в два раза меньше, чем у "классических" MIPS и SPARC RISC-процессоров, вот и разберись теперь, где CISC, а где RISC!), но 14 способов адресации (абсолютный рекорд даже в CISC-мире) увеличивают мощность множества доступных программисту вариаций до немыслимой цифры (даже не берусь точно ее назвать — руководство "Ассемблер 68000" содержит почти тысячу страниц…).

     Аппаратный интерфейс процессора трудно назвать уникальным, скорее наоборот, к нему лучше подходит термин "консервативный". 24-битовая адресная шина позволяет адресовать всего 16 MB ОЗУ (хотя 32-битовый счетчик команд, естественно, обеспечивает линейное адресное пространство 4 GB), зато дополнительные выводы "состояние процессора" позволяют использовать четыре 16 MB области со строгим функциональным назначением: память данных и программ пользовательского режима и аналогичные — для суперпользовательского. Современная версия M68000, выполненная по малопотребляющим полупроводниковым технологиям (M68EC000), способна работать как с 16-битовой шиной данных, так и в более экономичной (но проигрывающей по скорости) 8-битовой.

     Несмотря на продолжительную историю и минимальные изменения, M68000 и остальные представители многочисленных семейств 680×0, 683xx остаются одними из самых популярных микропроцессоров/контроллеров для индустриальных, военных и научных приложений, что стимулируется как высокой надежностью и отработанностью конструкций, так и разумной ценовой политикой Motorola (стоимость M68EC000 с тактовыми частотами от 8 до 20 MHz попадает в ценовой диапазон далеко не лучших 8-битовых микроконтроллеров). Кроме того, исторически сложившееся разнообразие вычислительной техники на этих процессорах привело к формированию громадных "залежей" программного обеспечения (на процессорах семейства M680x0 были основаны и персональные компьютеры Apple, Amiga, и старшие модели Sinclair, и рабочие станции Sun, Apollo, NeXT), что также упрощает применение этих "старичков" в разнообразной "умной" технике даже завтрашнего дня.
     

     По логике вещей, следовало бы продолжить рассказ и о настоящих процессорных "монстрах" — RISC-машинах класса MIPS или SPARC. Однако эти процессоры настолько сложны, что краткое описание способно лишь исказить представление о тенденциях развития систем "псевдо-RISC", да и ценовой диапазон старших моделей вызывает серьезные сомнения в перспективности подобных изделий на нашем рынке. Правда, усилиями производителей альтернативных (по отношению к i86) процессоров ситуация изменяется — IDT, освободившаяся от тяжелых вериг Pentium-совместимых чипов, буквально штурмует рынок высокопроизводительных встраиваемых процессоров, доведя стоимость 32-битовых моделей (клоны MIPS 3000) до нескольких долларов, а 64-битовых (MIPS 4000/5000) — до десятков (так, полноценный 64-битовый процессор, оснащенный FPU с пиковой производительностью более 600 MFLOPS и модулем аппаратной поддержки виртуальной памяти, в зависимости от тактовой частоты стоит $23—55). Аналогичную политику претворяет в жизнь и Fujitsu, активно развивающая линейку "облегченных" микропроцессоров SPARClite, снизив цену младших моделей до просто символической суммы.

     На одной интересной особенности, свойственной именно семейству процессоров SPARC, следует остановиться. Речь идет о windows (не путайте с программным продуктом) — регистровых окнах. Ориентированность системы команд RISC-машин на выполнение всех арифметических и логических инструкций только над регистрами процессора (так называемая архитектура загрузки/записи — load/store) для повышения производительности требует резкого увеличения числа рабочих регистров процессора. Это требование становится еще жестче, если учесть необходимость быстрой реакции программ (в первую очередь — операционной системы) на различные "внешние" по отношению к вычислительной системе события, отображаемые во "внутреннем" мире процессора прерываниями. В случае поступления сигнала прерывания приостанавливается выполнение текущей задачи и ОС приступает к процедуре обработки прерывания. По окончании обработки выполнение приостановленной задачи возобновляется. Неприятный (в смысле затрачиваемого времени) процесс сохранения/восстановления контекста приостанавливаемой задачи — серьезная головная боль как для разработчиков "железа", так и для системных программистов: чем больше регистров у процессора, тем большее количество их нужно сохранять/восстанавливать в обработчике прерывания. Получается явное противоречие: чтобы RISC-процессор был быстрым, у него должно быть как можно больше регистров, но чтобы реальная система на его основе работала быстро, регистров у процессора должно быть как можно меньше! Конструкторы SUN нашли изящное решение этой проблемы (вероятно, заимствованное у неувядающей идеи регистровых банков i8051): SPARC-процессоры действительно содержат очень много регистров общего назначения (например, SPARClite — 136), но пользовательской программе доступны только 32 из них (так называемое регистровое окно, рис. 4). При этом, как и более привычные "окна" пользовательских графических интерфейсов, регистровые окна перекрываются: 8 регистров являются уникальными для "окна", 8 — общими для окна и его верхнего (см. рис. 4) "соседа", 8 — общими с нижним "соседом", что позволяет очень быстро и эффективно передавать параметры и возвращать значения при вызовах подпрограмм. Отдельная группа из восьми регистров является глобальной — доступной любому процессу независимо от его регистрового "окна". По сути дела эта модель формирует восемь как бы независимых микропроцессоров с очень быстрым переключением средствами операционной системы.
     

     У последней черты…

     Естественно, что короткий обзор нескольких микропроцессоров не способен дать полного представления о картине мира вычислений — да и такая цель не преследовалась. Получившийся в результате пантеон вовсе не напоминает мавзолей — большинство рассмотренных процессоров (за исключением i8080) живут и здравствуют, как и их производители, и, вероятнее всего, будут незаметно помогать нам в повседневной жизни ближайший десяток лет. Гонка за сверхпроизводительностью, постепенно уводящая разработчиков менее массовых процессоров с хорошо освещенной гаревой дорожки простоты и эффективности в дебри сверхсложных реализаций, совершенно не интересует крупносерийную промышленность, и слава Богу. Пока здесь царствуют старые добрые семейства i8051, M680x0 и возрождающиеся из пепла клоны 6502, можете быть спокойны и за тормозную систему вашего автомобиля, и за безопасность электрического утюга или стиральной машины — "старый друг лучше новых двух", и он не подведет…