Занимательная микроэлектроника — страница 54 из 117

Легкостью программирования современных электронных узлов стали широко пользоваться производители оборудования, особенно в последние годы, чтобы оптимизировать свои прибыли. Делается это примерно так: разрабатывается некое устройство (видеокарта, пишущий привод и т. п.) с некими новыми возможностями. Естественно, оно продается несколько дороже аналогичных более примитивных устройств. Спустя некоторое время конкуренты догоняют, тогда это устройство снимается с продажи, а на рынок выбрасывается аналогичная модель с еще более расширенной функциональностью — по той же цене или еще несколько дороже. Другой вариант той же политики — одновременно выпустить линейку похожих устройств разного класса (например, по быстродействию) с ценой, отличающейся иногда в разы (характерно, например, для видеокарт). И простодушному покупателю невдомек, что разработан был лишь самый дорогой и «продвинутый» вариант, а все более дешевые отличаются лишь программой — «прошивкой» (ну, иногда еще отсутствием некоторых микросхем на плате). Выпуская модели с искусственно урезанной функциональностью, производитель имеет значительно большую суммарную прибыль, т. к. фактически одно и то же устройство может продаваться годами без значительных инвестиций в его доработку, а также охватить все секторы рынка, от самых простых до эксклюзивных. Во многих случаях пользователь сам может превратить дешевое устройство в более дорогое, сменив лишь микропрограмму — классическим примером сезона 2005/2006 годов стала линейка пишущих приводов NEC 3540, 3550, 4550 и др.

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

Ну а теперь перейдем к рассмотрению того, как работает микропроцессор «вообще».


Как работает микропроцессор

Для того чтобы понять, как работает микропроцессор (МП), зададим себе вопрос: а как он должен работать? Есть теория (в основном созданная постфактум: после того, как первые ЭВМ были уже построены и функционировали), которая указывает, как именно строить алгоритмы, и что процессор в соответствии с этим должен делать. Мы, естественно, углубляться в это не будем, просто констатируем, что любой алгоритм есть последовательность неких действий, записанных в виде набора последовательно выполняемых команд (инструкций, операторов). При этом среди таких команд могут встречаться переходы, которые в некоторых случаях нарушают исходную последовательность выполнения операторов строго друг за другом. Среди прочих должны быть также команды ввода и вывода данных (программа должна как-то общаться с внешним миром?), а также команды выполнения арифметических и логических операций.

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


МП и МК

Кстати, а почему мы все время говорим так: то микропроцессоры, то микроконтроллеры? Микроконтроллер (МК) отличается от микропроцессора тем, что он предназначен для управления другими устройствами, и поэтому имеет встроенную развитую систему ввода/вывода, но, как правило, относительно более слабое арифметико-логическое устройство (АЛУ). Микроконтроллерам очень хорошо подходит термин, который в советское время имел, правда, несколько иное значение— «микроЭВМ», еще точнее звучит английское «computer-on-chip». В самом деле, для построения простейшего вычислительного устройства, которое могло бы выполнять что-то полезное, обычный микропроцессор, от i4004 до Pentium и Core Duo, приходится дополнять памятью, BIOS, устройствами ввода/вывода, контроллером прерываний, тактовым генератором с таймерами и т. п. — всем тем, что сейчас стало объединяться в т. н. «чипсеты». «Голый» МП способен выполнить только одно: правильно включиться, ему даже программу загрузки неоткуда взять.

В то же время для МК микропроцессор — это только ядро, даже не самая большая часть кристалла. Для построения законченной системы на типовом МК не требуется вообще ничего, кроме источника питания и периферийных исполняющих устройств, которые позволяли бы человеку определить, что система работает. Обычный МК может без дополнительных компонентов общаться с другими МК, внешней памятью, специальными микросхемами (вроде часов реального времени или флэш-памяти), с компьютером, управлять небольшими (а иногда — и большими) матричными панелями, к нему можно напрямую подключать датчики физических величин (в том числе— чисто аналоговые, АЦП тоже входят в МК), кнопки, клавиатуры, светодиоды и индикаторы, короче — в микроконтроллерах сделано все, чтобы как можно меньше приходилось паять и задумываться над подбором элементов. За это приходится расплачиваться пониженным быстродействием (которое, впрочем, не так и требуется в типовых задачах для МК) и некоторым ограничением в отдельных функциях — по сравнению с универсальными, но в сотни раз более дорогими и громоздкими системами на «настоящих» МП. Вы можете мне не поверить, но процессоры для ПК, о которых мы столько слышим, занимают в общем количестве выпускаемых процессоров лишь 6 %, — остальные 94 % составляют микроконтроллеры различного назначения.


В соответствии со сказанным основной цикл работы процессора должен быть таким: выборка очередной команды (из памяти), при необходимости выборка исходных данных для нее, выполнение команды, размещение результатов в памяти (опять же если это необходимо). Вся работа в этом цикле должна происходить автоматически по командам некоторого устройства управления, содержащего тактовый генератор — системные часы, по которым все синхронизируется. Кроме того, где-то это все должно происходить — складирование данных, кода команды, выполнение действий и т. п., так что процессор должен содержать некий набор рабочих регистров (по сути — очень небольшую по объему сверхбыструю память), определенным образом связанных между собой, а также с устройством управления и АЛУ, которое неизбежно должно присутствовать.

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

Блок-схема типичного микропроцессора показана на рис. 11.2.



Рис. 11.2.Блок-схема типичного микропроцессора


Здесь мы включили в состав процессора память программ, которая у ПК-процессоров находится всегда отдельно — сами знаете, программы какого объема бывают в персональных компьютерах. В то же время в большинстве современных микроконтроллеров постоянное запоминающее устройство (ПЗУ) для программ входит в состав чипа и обычно составляет от 1 до 8 кбайт (но есть модели и со 256 кбайтами встроенной памяти!), чего для подавляющего большинства применений вполне достаточно, а если вдруг не хватит, то всегда можно подключить внешнюю память. Впрочем, внутреннее оперативное запоминающее устройство (ОЗУ) того или иного объема имеется во всех современных процессорах, у процессоров для ПК это называется кэш-памятью (иногда — нескольких уровней). Типичный размер ОЗУ данных у микроконтроллеров — от 256 байт до 1 кбайта.

Подробности

В первых моделях микропроцессоров (включая и lntel-процессоры для ПК — от 8086 до 386) процессор выполнял команды строго последовательно: загрузить команду, определить, что ей нужны операнды, загрузить эти операнды (по адресу регистров, которые их должны содержать; адреса эти, как правило, хранятся сразу после собственно кода команды, или определены заранее), потом проделать нужные действия, складировать результаты… До нашего времени дошла архитектура суперпопулярных еще недавно микроконтроллеров 8051, выпускающихся и по сей день различными фирмами (Atmel, Philips), которые выполняли одну команду аж за 12 тактов (в современных системах, впрочем, это число несколько меньше). Для ускорения работы стали делить такты на части (например, срабатывать по переднему и заднему фронтам), но действительный прорыв произошел с внедрением конвейера. Со времен Генри Форда известно, что производительность конвейера зависит только от времени выполнения самой длинной операции — если поделить команды на этапы и выполнять их одновременно разными аппаратными узлами, то можно добиться существенного ускорения (хотя и не во всех случаях).