Основы микропроцессорной техники

2. Организация обмена информацией


«Структура курса | Глава 1 | Глава 2 | Глава 3 | Глава 4 | Глава 5 | Глава 6 | Раздел 7 | Глава 8 | Дополнения

Раздел 2 - Страницы: « | 1 | 2 | 3 | 4 | 5 | 6 | »

2.4.2. Память

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

Информация в памяти хранится в ячейках, количество разрядов которых равно количеству разрядов шины данных процессора. Обычно она кратная восьми (например, 8, 16, 32, 64). Допустимое количество ячеек памяти определяется количеством разрядов шины адреса как 2 N, где N - количество разрядов шины адреса. Чаще объем памяти измеряется в байтах независимо от разрядности ячейки памяти. Используются также следующие большие единицы объема памяти: килобайт - 2 10 или 1024 байта (обозначается Кбайт), мегабайт - 2 20 или 1 048 576 байт (обозначается Мбайт), гигабайт - 2 30 байт (обозначается Гбайт), терабайт - 2 40 (обозначается Тбайт) Например, если память имеет 65 536 ячеек, каждая из которых 16-разрядная, то говорят, что память имеет объем 128 Кбайт. Совокупность ячеек памяти называется обычно пространством памяти системы.

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

Оперативная память общается с системной магистралью в циклах чтения и записи, постоянная память - только в циклах чтения. Преимущественно в составе системы существует несколько модулей памяти, каждый из которых работает в своей области пространства памяти. Селектор адреса раз и определяет, какая область адреса пространства памяти отведена данном модуля памяти. Схема управления производит в нужные моменты сигналы разрешения работы памяти (CS) и сигналы разрешения записи в память (WR). Буферы данных передают данные от памяти до магистрали или от магистрали к памяти.

В объеме памяти микропроцессорной системы обычно выделяются несколько особых областей, выполняющих специальные функции.

Память программы начального запуска всегда выполняется на ПЗУ или флэш-памяти. Именно из этой области процессор начинает работу после включения питания и после сброса его с помощью сигнала "RESET".


Рис. 2.18 Структура модуля памяти.

Память для стека или стек (Stack) - это часть оперативной памяти, предназначенная для временного хранения данных в режиме LIFO (Last In - First Out).

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

Принцип действия стека показан на Рис. 2.19 (адреса ячеек памяти избранные условно).

Пусть, например, текущее состояние показателя стека 1000008, и в него нужно записать два числа (слова). Первое слово будет записано по адресу 1000006 (перед записью показатель стека уменьшится на два). Второе - по адресу 1000004. После записи содержимого показателя стека - 1000004. Если затем прочитать из стека два слова, то первым будет прочитано слово с адреса 1000004, а после чтения показатель стека станет равным 1000006. Вторым будет прочитано слово с адреса 1000006, а показатель стека станет равным 1000008. Все вернулось к исходному состоянию. Первое записанное слово читается вторым, а второе - первым.


Рис. 2.19 Принцип работы стека.

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

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

Следующая специальная область памяти - это таблица векторов прерываний.

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

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

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

Пусть, например, процессор (Рис.2.20) выполнял основную программу и команду, которая находится в памяти по адресу 5000 (условно). В этот момент он получил запрос прерывания с номером (адресом вектора) 4. Процессор заканчивает выполнение команды с адреса 5000. Затем он сохраняет в стеке текущее значение счетчика команд (5001) и текущее значение PSW. После этого этот процессор читает с адреса 4 памяти код вектора прерывания. Пусть этот код равен 6000. Процессор переходит в адрес памяти 6000 и приступает к выполнению программы обработки прерывания, которая начинается с этого адреса. Пусть эта программа заканчивается по адресу 6100. Дойдя до этого адреса, процессор возвращается к выполнению прерванной программы. Для этого он извлекает и стека значение адреса (5001), на котором его прервали, и бывшее в тот момент PSW. Затем процессор читает команду с адреса 5001 и далее последовательно выполняет команды основной программы.


Рис. 2.20. Упрощенный алгоритм обработки прерывания.

Прерывание Аварийный обрабатывается точно так же, только адрес вектора прерывания (номер строки в таблице векторов) жестко привязан к данному типу аварийной ситуации.

Программное прерывание тоже обслуживается через таблицу векторов прерываний, но номер прерывания указывается в составе команды, которая вызывает прерывание.

Такая сложная, на первый взгляд, организация прерываний позволяет программисту легко изменять программы обработки прерываний, располагать их в любой области памяти, делать их любого размера и любой сложности.

Во время выполнения программы обработки прерывания может поступить новый запрос на прерывание. В этом случае он обрабатывается точно так же, как описано, но основной программой считается прервана программа обработки предыдущего прерывания. Это называется многократным вложением прерываний. Механизм стека позволяет без проблем обслуживать это многократное вложение, так как первым из стека извлекается тот код, который был сохранен последним, то есть возвращение обработки данного прерывания происходит в программу обработки предыдущего прерывания.

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

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

Все остальные части пространства памяти, как правило, имеют универсальное назначение. В них могут располагаться как данные, так и программы (обычно в случае одношиннои архитектуры. Иногда это пространство памяти используется как единое целое, без всяких границ. А иногда пространство памяти делится на сегменты с программно изменяемой адресу начала сегмента и с определенным размером сегмента. Оба подхода имеют свои плюсы и минусы. Например, использование сегментов позволяет защитить область программ или данных, но зато границы сегментов могут затруднять размещения крупных программ и массивов данных.

В заключение остановимся на проблеме разделения адресов памяти и адресов устройств ввода / вывода. Существует два основных подхода к решению этой проблемы:

  • выделение в общем адресном пространстве системы специальной области адресов устройств ввода / вывода;
  • полное родилення адресных пространств памяти и устройств ввода / вывода.

Первый подход хорош тем, что при обращении к устройствам ввода / вывода процессор может использовать те же команды, которые служат для взаимодействия с памятью. Но адресное пространство памяти должен быть уменьшен на величину адресного пространства устройств ввода / вывода. Например, при 16-разрядной шине адреса все го может быть 64К адресов. Из них 56К адресов уделяется под адресного пространства памяти, а 8К адресов - под адресное пространство устройств ввода / вывода.

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


«Структура курса Раздел 2 - Страницы: « | 1 | 2 | 3 | 4 | 5 | 6 | »