29/02/96 13:50
dma.lek
Роберт Журден "Справочник
программиста на компьютере фирмы
IBM".
А.Г.Шевчик, Т.В.Демьянков
"Справочник программиста и
пользователя" серия
"Карманная энциклопедия"
М."Кварта" 1993.
Ю.М.Казаринов "Микропроцессорный
комплект К1810. Структура,
программирование, применение."
Справочная книга. М. "Высшая
школа" 1990.
Контроллер прямого доступа к памяти.
Введение.
Прямой доступ к памяти (DMA) - это метод непосредственного обращения к памяти, минуя процессор. Процессор отвечает только за программирование DMA: настройку на определенный тип передачи, задание начального адреса и размера массива обмениваемых данных. Обычно DMA используется для обмена массивами данных между системной памятью и устройствами ввода-вывода.
Обмен данными между процессором и устройствами ввода-вывода осуществляется по системной шине, "хозяином" которой является процессор. При использовании контроллера DMA на время обмена данными он должен получить управление системной шиной, т.е. стать ее "хозяином". По окончании обмена подсистема DMA возвращает процессору право управления шиной.
Архитектура компьютера PC AT включает в себя подсистему DMA, состоящую из двух контроллеров DMA Intel 8237, регистра старшего адреса DMA и регистров страниц DMA. Эти контроллеры обеспечивают 7 каналов DMA.
Система обеспечивает передачу данных по каналам DMA как по одному байту за цикл DMA, так и по два байта за цикл, исходя из возможностей архитектуры процессора (двухбайтной шины данных). Чтобы сохранить преемственность подсистемы DMA в PC AT с аналогичной подсистемой в PC XT каскадирование "байтного" контроллера DMA с распределением каналов XT осуществляется через "словный" контроллер DMA.
Общий алгоритм ПДП.
Для осуществления прямого доступа к памяти контроллер должен выполнить ряд последовательных операций:
принять запрос (DREQ) от устройства ввода-вывода;
сформировать запрос (HRQ) в процессор на захват шины;
принять сигнал (HLDA), подтверждающий захват шины;
сформировать сигнал (DACK), сообщающий устройству о начале обмена данными;
выдать адрес ячейки памяти, предназначенной для обмена;
выработать сигналы (MEMR, IOW или MEMW, IOR), обеспечивающие управление обменом;
по окончании цикла DMA либо повторить цикл DMA, изменив адрес, либо прекратить цикл.
Формирование адреса памяти.
Контроллеры DMA обеспечивают формирование только 16 младших разрядов адреса памяти. Причем старшая часть адреса (А15-А8 для DMA1 или А16-А9 для DMA2) во время цикла DMA по шине данных поступает в регистр старшего адреса DMA и далее на шину адреса, а младшая часть адреса (А7-А0 для DMA1 или А8-А1 для DMA2) выдается на шину адреса непосредственно из контроллера. Восемь старших разрядов адреса памяти содержатся в регистре страниц DMA. Разряд А16 из регистра страниц DMA запрещается, когда выбран DMA2. Разряд A0 не связан с DMA2 и всегда содержит нуль при передаче слова.
Это означает, что:
размер блока данных, который может быть передан или адресован, измеряется не байтами (8 бит), а словами (16 бит);
слова всегда должны быть расположены на четной границе.
Таким образом, контроллер DMA и регистр страниц определяют 24-разрядный адрес, что обеспечивает передачу данных в пределах адресного пространства 16 М байт.
Регистры страниц.
Регистр страниц вместе с контроллерами DMA он определяет полный (24-разрядный) адрес для каналов DMA.
Адреса портов регистров страниц:
Канал DMA |
Адрес порта регистра страниц |
0 |
087h |
1 |
083h |
2 |
081h |
3 |
082h |
4 |
- |
5 |
08Вh |
6 |
089h |
7 |
08Ah |
Регенерация |
08Fh |
* Содержимое регистра страниц в целях регенерации должно быть равно 00h.
Адресация портов.
В таблице приведены адреса портов - регистров адреса ОП и управления/состояния контроллеров DMA, а также форматы регистров:
Функции регистров |
Формат |
Адреса портов |
Чтение/запись |
|
DMA1 |
DMA2 |
|||
Регистр
состояния (STAT) |
8 |
008h |
0D0h |
Чтение |
Регистр
команд (CR) |
Запись |
|||
Регистр
режима (MOD) |
6 |
00Bh |
0D6h |
Запись |
Регистр
режима (MOD)*** |
Чтение |
|||
Запись
одиночных разрядов регистра
маск |
4 |
00Ah |
0D4h |
Запись |
Регистр
команд (CR)*** |
8 |
Чтение |
||
Запись
всех разрядов маски |
4 |
00Fh |
0DEh |
Запись |
Регистр
маски (MASK)*** |
Чтение |
|||
Программный
регистр запросов (REQ)** |
4 |
009h |
0D2h |
Запись |
Регистр
запросов *** |
Чтение |
|||
Базовый и текущий регистры адреса - канал 0 |
16 |
000h |
0C0h |
Запись |
Текущий регистр адреса канал 0 |
16 |
000h |
0C0h |
Чтение |
Базовый и текущий регистры cчетчика - канал 0 |
16 |
001h |
0C2h |
Запись |
Текущий регистр счетчика - канал 0 |
16 |
001h |
0C2h |
Чтение |
Базовый и текущий регистры адреса - канал 1 |
16 |
002h |
0C4h |
Запись |
Текущий регистр адреса - канал 1 |
16 |
002h |
0C4h |
Чтение |
Базовый и текущий регистры cчетчика - канал 1 |
16 |
003h |
0C6h |
Запись |
Текущий регистр счетчика - канал 1 |
16 |
003h |
0C6h |
Чтение |
Базовый и текущий регистры адреса - канал 2 |
16 |
004h |
0C8h |
Запись |
Текущий регистр адреса - канал 2 |
16 |
004h |
0C8h |
Чтение |
Базовый и текущий регистры cчетчика - канал 2 |
16 |
005h |
0CAh |
Запись |
Текущий регистр счетчика - канал 2 |
16 |
005h |
0CAh |
Чтение |
Базовый и текущий регистры адреса - канал 3 |
16 |
006h |
0CCh |
Запись |
Текущий регистр адреса - канал 3 |
16 |
006h |
0CCh |
Чтение |
Базовый и текущий регистры cчетчика - канал 3 |
16 |
007h |
0CEh |
Запись |
Текущий регистр счетчика - канал 3 |
16 |
007h |
0CEh |
Чтение |
Временный
регистр данных(TR)** |
16 |
00Dh |
0DAh |
Чтение |
Общий
сброс |
* |
Запись |
||
Сброс F/F(Clear Byte Pointer Flip-Flop) |
* |
00Ch |
0D8h |
Запись |
Установка
F/F *** |
Чтение |
|||
Сброс
регистра маски |
* |
00Eh |
0DCh |
Запись |
Сброс
счетчика MODE *** |
Чтение |
* Это не регистры, а непосредственные команды для контроллера DMA.
** Эти регистры используются только в режиме ПАМЯТЬ-ПАМЯТЬ.
*** Эти регистры и команды контроллера DMA не реализованы в контроллере 8237А и в "Периферийном контроллере" STC62C008, но реализованы в большинстве современных комплектов процессорных БИС.
Режимы обслуживания.
В активном цикле обслуживание подсистемы DMA возможно в одном из четырех режимов. Окончание обслуживания распознается по переходу регистра счетчика слов из 0000Н в FFFFН. При этом возникает сигнал окончания счета (TC), который может вызвать автоинициализацию, если она запрограммирована, или маскирование канала при ее отсутствии.
Одновременно с TC вырабатывается выходной сигнал -EOP. Во время автоинициализации первоначальные значения регистров текущего адреса и счетчика восстанавливаются из соответствующих базовых регистров. После автоинициализации канал готов выполнять другое обслуживание подсистемы DMA без вмешательства CPU, как только обнаружится достоверный DREQ.
Режим одиночной передачи (Single Transfer Mode)
В этом режиме контроллер DMA выполняет только одну передачу. Адрес и счетчик слов будут изменяться при каждой передаче. DREQ должен быть активным, пока не активизируется соответствующий DACK. Если DREQ активен на протяжении одиночной передачи, HRQ переходит в неактивное состояние по выполнении одной передачи и освобождает шину системе. HRQ снова станет активным (при активном DREQ) и по получении нового HLDA будет выполняться следующий цикл одиночной передачи. Это гарантирует CPU в системе выполнение одного полного машинного цикла между передачами DMA.
Режим передачи блока (Blok Transfer Mode)
В этом режиме передается блок информации во время обслуживания подсистемы DMA. DREQ должен быть активным, пока не появиться активный DACK.
Режим передачи по требованию (Demand Transfer Mode)
В этом режиме передача данных выполняется до тех пор, пока не появится TC или внешний -EOP, либо когда DREQ станет неактивным. Таким образом, передачи могут продолжаться до тех пор, пока периферийное устройство не исчерпает объем данных.
Каскадный режим (Cascade Mode)
Этот режим использует объединение нескольких контроллеров DMA для расширения числа подключаемых каналов. Выходы HRQ и входы HLDA от дополнительных контроллеров соединяются соответственно со входами DREQ и выходами DACK первичного контроллера DMA . Это дает возможность запросам от дополнительного устройства распространяться через сеть приоритетных цепей предшествующего устройства.
Таким образом, канал первичного контроллера DMA, к которому подключен дополнительный контроллер, программируется на выполнение каскадного режима и служит только для определения приоритета дополнительного устройства и транзита сигналов HRQ в CPU и HLDA из CPU. Все другие сигналы каскадного канала первичного контроллера DMA в формировании циклов подсистемы DMA не участвуют.
Режим память-память
Этот режим предназначен для передачи блоков данных из одного адресного пространства памяти в другое с минимальными программными и временными затратами, но в PC AT не используется. В данном режиме могут работать только нулевой и 1-й каналы контроллера. Эта передача инициируется программной установкой REQ для канала 0. Адрес ячейки памяти-источника данных задают в CAR0, а ячейки-приемника - в CAR1. Байт данных, считанный из памяти, заносится во временный регистр (TR) и затем из TR считывается в ячейку-приемник. Когда значение счетчика слов канала 1 станет равным FFFFh, обслуживание заканчивается.
Типы передач.
Каждый из трех
активных режимов предполагает
выполнение трех различных передач.
Это ЧТЕНИЕ, ЗАПИСЬ и ПРОВЕРКА.
Передача ЧТЕНИЕ пересылает данные
из памяти в периферийное
устройство при активизации -MEMR и -IOW.
Передача ЗАПИСЬ пересылает данные
из периферийного устройства в
память при активизации -MEMW и -IOR.
ПРОВЕРКА - это псевдопередача.
Подсистема DMA осуществляет
передачи ЧТЕНИЯ или ЗАПИСИ,
генерируя адреса и реагируя на -EOP,
но сигналы управления памятью и
периферийными устройствами
остаются не активными. Вход READY
игнорируется в ПРОВЕРКЕ.
Приоритеты.
Подсистема DMA
имеет два типа приоритета, которые
можно установить программно.
Первый из них - фиксированный
приоритет, который фиксирует
каналы в последовательности,
соответствующей убыванию их
номеров.
Низший приоритет имеет канал номер
3, а высший приоритет имеет канал 0.
После выбора какого-либо канала для
обслуживания запрещается
вмешательство остальных каналов до
тех пор, пока обслуживание не
завершится.
Второй тип приоритета - циклический. Последний обслуженный канал становится каналом с низшим приоритетом согласно циклу. При циклическом приоритете любое устройство, требующее обслуживания, непременно будет распознано после обработки максимум трех более приоритетных обслуживаний. Это исключает монополизацию всей системы одним каналом.
Регистры контроллера DMA.
Регистр текущего адреса (CAR)
Каждый канал
имеет 16-разрядный регистр текущего
адреса. Этот регистр хранит младшие
разряды адреса, используемые во
время обслуживания ПДП.
Адрес автоматически уменьшается
или наращивается после каждой
передачи, а промежуточные значения
адреса запоминаются в регистре во
время передачи.
Содержимое текущего регистра
записывается или читается
микропроцессором побайтно.
Регистр текущего счетчика слов (CCR)
Каждый канал имеет 16-разрядный регистр текущего счетчика слов. Этот регистр определяет количество передач, которые необходимо выполнить. Количество передач будет на единицу больше, чем число, программируемое в регистре (т.е. в счетчик заносится число 100, а передач будет 101).
Значение счетчика уменьшается после каждой передачи, а промежуточное значение счетчика записывается в регистр во время передачи.
В режиме программирования регистр CCR может быть побайтно записан или прочитан микропроцессором. По концу обслуживания, если не задана автоинициализация, значение счетчика после TC равно FFFFH.
Между обслуживаниями, когда микропроцессору разрешается выполнять операции, промежуточные значения адреса и счетчика слов хранятся в регистрах текущего адреса и счетчика соответствующего канала.
Базовые регистры адреса и счетчика (BAR и CAR)
Каждый канал имеет два регистра: регистр базового адреса и регистр базового счетчика. Эти регистры хранят начальные значения соответствующих текущих регистров. При автоинициализации они используются для восстановления первоначальных значений текущих регистров. Базовые регистры загружаются микропроцессором поразрядно одновременно со своими текущими регистрами в режиме программирования. Считать содержимое базовых регистров нельзя.
Регистр режима (MOD - 00B, 0D6)
Каждый канал имеет 6-разрядный регистр режима (MOD). Запись в регистр производится в режиме программирования байтом, формат которого представлен на рисунке. Разряды 0, 1 указывают, в регистр режима какого канала нужно произвести запись, а разряды 2-7 - информацию непосредственно для соответствующего регистра режима. Для регистра режима разрешена только запись информации.
Регистр команд (CR - 008, 0D0)
Этот 8-разрядный регистр управляет операциями контроллера DMA. Он программируется микропроцессором и сбрасывается либо по входу RESET либо командой MC (очистка системы). Формат байта записи представлен на рис. Регистр команд не может быть считан микропоцессором.
Регистр запроса (REQ; 009, 0D2)
Контроллер DMA
может реагировать на запросы по
обслуживанию DMA, которые будут
инициироваться программно, как и
при DREQ. Каждый канал имеет свой
разряд в 4-разрядном регистре
запроса. Эти разряды немаскируемые,
приоритет которых устанавливается
шифратором приоритетов.
Каждый разряд регистра
сбрасывается и устанавливается под
управлением программы или
очищается при генерации TC или
внешнего -EOP. Весь регистр очищается
по RESET. Разряд устанавливается или
сбрасывается программой, которая
загружет слово данных
соответствующего формата,
приведенного на рис.
Для того чтобы получить программный запрос, канал должен находиться в режиме блока. Регистр запроса не может быть считан микропоцессором.
Каждый канал
имеет свой разряд в 4-разрядном
регистре маски, который может быть
установлен, чтобы заблокировать
приходящий DREQ. Каждый разряд маски
устанавливается, когда связанный с
ним канал вырабатывает -EOP, если
канал не запрограммирован на
автоинициализацию (в этом случае по
-EOP маска не устанавливается).
Каждый разряд 4-разрядного регистра
маски может быть установлен или
сброшен под управлением программы.
Весь регистр устанавливается по
RESET. При этом блокируются все
запросы DMA, пока их не разрешит
команда сброса регистра маски.
Команда раздельной
установки/сброса маски подобна
команде раздельной
установки/сброса регистра запроса.
Одновременно все четыре разряда
маски могут быть записаны
отдельной командой - Write All Mask Register
Bits. Регистр маски не может быть
считан микропоцессором.
При инициализации регистра маски используются байты с форматами, приведенными на рис.
Рис. Формат байта для установки или сброса одного разряда MASK (00A, 0D4)
Рис. Формат байта для записи информации во все разряды MASK (00F, 0DE)
Регистр состояний (STAT - 008, 0D0)
Содержимое регистра состояния может быть прочитано микропроцессором. Регистр содержит информацию о состоянии каналов в данный момент времени. Эта информация показывает, какие каналы достигли заполнения счетчика (т.е. сгенерировали TC) и какие каналы имеют неудовлетворенные запросы Разряды 0-3 регистра устанавливаются каждый раз, как появляется TC для соответствующего канала или внешний -EOP. Эти разряды сбрасываются по RESET и при каждом чтении регистра состояния.
Разряды 4-7 устанавливаются всякий раз, когда соответствующий канал запрашивает обслуживание.
Временный регистр (TR - 00D, 0DA)
Регистр
используется для хранения данных в
течение передачи ПАМЯТЬ-ПАМЯТЬ.
После окончания передач последнее
слово может быть считано
микропроцессором.
Регистр всегда содержит последний
байт, переданный в предыдущей
операции ПАМЯТЬ-ПАМЯТЬ, если не
сброшен по RESET.
Программирование контроллера.
Контроллер DMA
может программироваться
процессором, когда HLDA не активен;
это утверждение истинно, даже если
активен HRQ. Ответственность
процессора заключается в гарантии,
что программирование контроллера и
активный HLDA взаимоисключающие.
Если -CS и HLDA в низком состоянии,
контроллер DMA входит в режим
программирования. Выбор регистров
при программировании
осуществляется с помощью адресной
шины A0-A3, работающей на вход, а выбор
режима записи или считывания - с
помощью сигналов -IOW или -IOR. При
записи/считывании 16- разрядных
регистров адреса или счетчика
соответствующего канала необходим
дополнительный разряд адреса, в
качестве которого используется
внутренний триггер FF. По FF=0
происходит обращение к младшему
байту, а по FF=1 - к старшему байту
регистра адреса или счетчика.
Кроме того, для контроллера
существуют дополнительные
специальные команды, которые могут
быть выполнены в режиме
программирования и не зависят от
набора разрядов на шине данных. К
ним относятся следующие команды:
сброс
триггера FF (Clear First/Last Flip-Flop; 00C,
0D8).
Эта команда выполняется перед
записью или чтением информации
из регистров адреса или
счетчика слов контроллера DMA.
Триггер FF устанавливается
таким образом, чтобы
микропроцессор адресовал
старший и младший байты в
нужной последовательности;
очистка
(Master Clear; 00D, 0DA).
По этой программной команде в
контроллере DMA выполняются
такие же действия, как и по
аппаратному RESET. Очищаются
регистры команд, состояния,
запросов и триггер FF, а регистр
маски устанавливается. После
этого контроллер DMA переходит в
холостой цикл;
cброс
регистра маски (Clear Mask Register; 00E,
0DC).
По этой команде очищаются
разряды масок для всех 4
каналов, что разрешает им
принимать запросы DMA. После
включения питания
предполагается, что все
внутренние ячейки, особенно
регистр MOD, будут загружены
некоторым действительным
значением. Это необходимо
сделать, даже если некоторые
каналы не используются.
Пример программирования подсистемы DMA.
PC AT использует канал 2 контроллера DMA для обмена с гибким диском. Чтобы получить доступ к верному адресу памяти, необходимо загрузить соответствующий регистр страниц. В данном случае для канала 2 это адрес порта 81h.
В приводимом примере ограничимся рассмотрением установки канала 2 для чтения одного сектора (512 байт) гибкого диска, начиная со смещения внутри страницы, содержащегося в BX. Программа имеет следующий вид:
mov al,46h ;Канал 2, передача одного байта, чтение с диска (4Аh для записи на диск)
out dma+0B,al ;Установить байтный режим
out dma+0C,al ;Сбросить триггер FF
mov al,bl ;Загрузить смещение адресов в текущий регистр страниц DMA
out dma+4,al
mov al,bh
out dma+4,al
mov al,0 ;Загрузить счетчик=512
out dma+5,al
mov al,2
out dma+5,al
out dma+0A,al ;Размаскировать канал 2 и читать сектор Примечание: dma - это базовый адрес, равный 00h.
Регенерация.
Оперативная память, как правило, строится на динамических элементах, которые требуют периодической регенерации, т.е. обновления заряда конденсатора, который и хранит информацию.
Осуществляется
регенерация не сразу всей
микросхемы памяти, а отдельных
строк через некоторые промежутки
времени. При этом время, через
которое выполняется регенерация
одной и той же строки, должно строго
соблюдаться.
Для осуществления регенерации
необходимо иметь два счетчика:
первый - счетчик временных
интервалов между запросами на
регенерацию строк микросхем
памяти, второй - счетчик перебора
строк (счетчик адреса
регенерируемой строки).
Первый
счетчик является каналом 1
системного таймера (порт 41). Обычно
этот канал настраивается на выдачу
коротких импульсов с периодом 15
мкс, хотя в машинах последних
моделей эта величина может быть
больше.
Запрос на регенерацию фиксируется
на триггере по отрицательному
фронту DMACLK в отличие от запросов на
обслуживание циклов DMA, которые
фиксируются по положительному
фронту (см. параграф "Режим
прямого доступа к памяти"). Тем
самым разнесены во времени моменты
возникновения запросов от DMA и
запросов на регенерацию. Первым
будет обслуживаться тот запрос,
который пришел раньше. По своему
приоритету запросы являются
равноправными. Запрос, который
зафиксирован на триггере раньше,
будет блокировать прохождение
другого запроса (имеется в виду не
два запроса на регенерацию, а один
запрос от подсистемы DMA и один
запрос на регенерацию). Если запрос
на регенерацию пришел раньше
запроса от подсистемы DMA, то его
появление вызовет активизацию
сигнала CPU HRQ, который является
запросом микропроцессору на захват
управления шиной.
С ростом тактовой частоты микропроцессора длительность цикла регенерации памяти на некоторых комплектах БИС может сокращаться. Это может привести к сбоям в работе некоторых адаптеров, которые имеют элементы памяти, рассчитанные на длинный цикл регенерации. Точно так же, как и цикл шины, выполняемый под управлением микропроцессора или контроллера DMA, цикл регенерации может быть растянут путем выдачи сигнала IOCHRDY низкого уровня.
Влияние регенерации на производительность микропроцессора.
Так как в выполнении цикла регенерации участвует шина, микропроцессор какую-то часть времени выполнения регенерации ожидает ее освобождения, что снижает его производительность. Причем чем выше тактовая частота микропроцессора, тем больше потери из-за регенерации. Поэтому для повышения производительности в машинах с современными элементами памяти реализуемая частота запросов на регенерацию ниже, чем была принята ранее.