Но в программировании для микроконтроллеров это все еще не так. Хотя гейтсовский интерпретатор Basic «влезет» в большинство современных однокристальных МК, но экономная программа легче отлаживается (а значит, содержит меньше ошибок) и быстрее выполняется. Три-четыре такта, потерянных на вызове процедуры, могут стать причиной какой-нибудь трудновылавливаемой ошибки времени выполнения, например, если за это время произойдет вызов прерывания. Поэтому память в МК стоит экономить, даже если вы располагаете заведомо достаточным ее объемом.
Согласно упоминавшимся принципам фон Неймана, которые до сих пор являются основополагающими для разработчиков компьютерных систем, память должна быть организована иерархически, от памяти малого объема, но с высоким быстродействием, до медленной памяти большой емкости. Именно так и проектируют современные компьютеры, которые содержат очень быструю кэш-память на одном кристалле с процессором (а иногда два или три уровня такой памяти), потом идет быстродействующее ОЗУ (оперативное запоминающее устройство, та самая память, которая указывается в характеристиках ПК), а затем более медленные устройства типа жестких дисков или CD- и DVD-ROM.
Далее мы рассмотрим основные разновидности памяти, используемые как в составе микроконтроллеров, так и во внешних узлах. И начнем с того, что попробуем сами сконструировать устройство долговременной памяти — ПЗУ (постоянное запоминающее устройство). Как мы увидим, любая память в принципе есть не что иное, как преобразователь кодов.
Изобретаем простейшую ROM
Всем известное благодаря распространению оптических дисков сокращение ROM — Read Only Memory — и есть не что иное, как «западное» название ПЗУ. На самом деле это название («память только для чтения») не очень точно характеризует суть дела, отечественный термин «постоянное запоминающее устройство» более корректен, самое же правильное называть такую память «энергонезависимой». ПЗУ отличается от других типов памяти не тем, что его можно только читать, а записывать нельзя, а тем, что информация в нем не пропадает при выключении питания. Сама по себе невозможность записи теперь нехарактерна даже для компакт-дисков, однако название ROM сохранилось.
Тем не менее первыми разновидностями ПЗУ, изобретенными еще в 1956 году, были именно нестираемые кристаллы, которые носят наименование OTP ROM (One-Time Programmable ROM, «однократно программируемое ПЗУ»). До недавнего времени на них делали память программ МК для удешевления серийных устройств. Вы отлаживаете программу на перезаписываемой памяти, а в серию пускаете приборы с «прожигаемой» OTP ROM. И лишь в последние годы «прожигаемая» память стала постепенно вытесняться более удобной flash-памятью, когда последняя подешевела настолько, что смысл в использовании одноразовых кристаллов пропал. Они продолжают выпускаться лишь за счет инерции производства: в 2007 году доля однократно программируемых и масочных (т. е. программируемых прямо на производстве) микроконтроллеров составит, по прогнозам, не более 1/4 всех выпускаемых чипов.
Мы сконструируем подобие «прожигаемого» ПЗУ с помощью диодов. Простейший вариант такого ПЗУ представлен на рис. 11.4. В данном случае он представляет собой не что иное, как преобразователь из десятичного кода в семисегментный.
Рис. 11.4. Простейшее ПЗУ — преобразователь кода
Если на входе поставить дешифратор типа 561ИД1, то мы получим аналог микросхемы 561ИД5. Представьте себе, что первоначально на всех пересечениях между строками и столбцами диоды присутствовали — это вариант незаполненной памяти, в которой записаны все единицы. Затем мы взяли и каким-то образом (например, подачей высокого напряжения) разрушили те диоды, которые нам не нужны, в результате чего получили нужную конфигурацию. Эта схема не содержит активных элементов и потому возможности ее ограничены, например, выходы устройства, подающего активный высокий уровень по входным линиям, должны «тащить» всю нагрузку по зажиганию сегментов. Обычная микросхема ПЗУ построена на транзисторных ячейках и поэтому без всяких хитростей принимает и выдает обычные логические уровни. К тому же она включает в себя и дешифрирующую логику, поэтому на вход подается двоичный, а не десятичный код.
Постойте, а при чем тут ПЗУ вообще? Дело в том, что любое ПЗУ можно представить, как универсальный преобразователь кодов, если рассматривать входной код, как адрес ячейки, а код, получающийся на выходе — как содержимое этой ячейки. Причем удобство состоит в том, что изначально в ПЗУ не записано ничего (одни нули или единицы), и мы можем реализовать на нем любую логическую функцию, все зависит только от емкости. В том числе, такую простую, как преобразователь кодов. Или такую сложную, как операционная система Windows. Последнее мы каждый раз и делаем, когда устанавливаем Windows на компьютер, причем в качестве ПЗУ выступает жесткий диск. Из этого примера отчетливо видно, что каким бы сложным ни был алгоритм, он все равно в конечном итоге сводится к совокупности однозначных логических уравнений, которые можно реализовать как через ПЗУ, так и с помощью устройства памяти любого другого типа.
Читать дальше
Конец ознакомительного отрывка
Купить книгу