Контроллер прямого доступа к памяти как отключить
Перейти к содержимому

Контроллер прямого доступа к памяти как отключить

  • автор:

Как в системе Windows настроить прямой доступ к памяти (DMA)

Для выполнения этих шагов необходимо войти в систему с правами администратора.

Прямой доступ к памяти (DMA) обычно включен по умолчанию для таких устройств, как жесткие диски, а также устройств для компакт- и DVD-дисков с поддержкой DMA. Однако, может потребоваться включении DMA вручную, если устройство неправильно установлено или если возникла системная ошибка.

  1. Откройте диспетчер устройств.
  2. Дважды щелкните Контроллеры IDE ATA / ATAPI.
  3. В разделе Контроллеры IDE ATA / ATAPI щелкните правой кнопкой мыши каждый элемент, в названии которого есть слово Канал (Channel), и выберите пункт Свойства.
  4. Перейдите на вкладку Дополнительные параметры. В разделе Свойства устройства установите или снимите флажок Включить прямой доступ к памяти и нажмите кнопку ОК .

Урок 33. Прямой доступ к памяти в STM32. Контроллер DMA.

Контроллер ПДП

В уроке узнаем о способе передачи данных в режиме прямого доступа к памяти, реализации этого процесса в микроконтроллере STM32. Подробно изучим режимы работы, форматы регистров, особенности контроллера ПДП STM32.

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

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

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

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

  • А вот при реализации цифрового осциллографа в уроке 29 программное чтение данных АЦП значительно ограничивало возможности устройства. На время чтения развертки осциллографа программа работала в блокирующем режиме, зависала. Приходилось даже запрещать прерывания. Благодаря высокому быстродействию STM32 удалось считывать данные АЦП с дискретностью 1 мкс, но это был предел. С большей скоростью поток данных уже не обработать.

А ведь задача пересылки данных между памятью и периферийным устройством с аппаратной точки зрения очень простая. Достаточно аппаратного счетчика адреса памяти, счетчика количества данных и промежуточного регистра. Данное считывается, например, из АЦП и записывается в память по адресу из специального регистра-счетчика. Его содержимое увеличивается на 1, и новое данное из АЦП записывается в память по следующему адресу. Процесс продолжается пока счетчик количества данных не остановит работу устройства. При этом процессор продолжает выполнение основной программы.

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

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

  • между памятью и периферийными устройствами микроконтроллера,
  • или между периферийными устройствами,
  • или между блоками памяти

называется прямым доступом к памяти (ПДП). Английская аббревиатура DMA — Direct memory access.

Аппаратная часть микроконтроллера, реализующая процесс прямого доступа к памяти называется контроллер прямого доступа к памяти (контроллер DMA).

Использование ПДП (DMA) позволяет:

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

Контроллер ПДП

Устройство контроллеров DMA, как правило, простое, очевидное и понятное для разработчиков программ.

Общие принципы работы контроллера прямого доступа к памяти в STM32.

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

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

  • В микроконтроллере STM32F103c8 есть только один контроллер DMA c 7 каналами. В микроконтроллерах старших серий (high-density и XL-density) добавлено второе устройство DMA.
  • Как я писал выше, прямой доступ к памяти происходит по общей с процессором системной шине. Поэтому при одновременном обращении к памяти или периферийному устройству процессора и контроллера DMA могут возникать конфликты. В результате работа процессора может приостанавливаться, но как минимум половина пропускной способности системной шины отдается процессору. Программа будет выполняться даже при интенсивном обмене через прямой доступ к памяти. Не говоря о том, что не каждая команда программы работает с оперативной памятью или периферийным устройством.
  • Инициаторами обмена с помощью контроллера DMA являются аппаратные события микроконтроллера (event). Конечно, при наличии соответствующих разрешений в управляющих регистрах. В уроке 18 я писал о событиях, и чем они отличаются от прерываний.

В общем случае прямой доступ к памяти происходит следующим образом.

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

Сам обмен данными (транзакция) с использованием DMA состоит из трех операций.

  • Данное загружается в промежуточный регистр из памяти или из регистра данных периферийного устройства в зависимости от направления обмена. Адреса памяти и периферийного устройства содержатся в специальных регистрах.
  • Данное перегружается в память или регистр данных периферийного устройства.
  • Регистр количества транзакций (элементов обмена) уменьшается на 1. При достижении 0, обмен завершается.

Все просто и логично.

Каналы DMA.

Повторюсь. В микроконтроллере STM32F103c8 есть только один контроллер DMA c 7 каналами.

С точки зрения программиста каждый канал – это отдельный аппаратный узел микроконтроллера. Он осуществляет DMAпередачу между регистром данных периферийного устройства (расположенным по фиксированному адресу) и памятью.

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

В каждый момент времени обмен данными может происходить только по одному каналу. При нескольких активных каналах контроллер DMAразрешает работу канала с более высоким приоритетом.

Приоритет каждого канала устанавливается программно и может иметь четыре уровня:

  • Very high priority (очень высокий);
  • High priority (высокий);
  • Medium priority (средний);
  • Low priority (низкий).

При активных каналах с одинаковым уровнем приоритета преимущество имеют каналы с меньшим номером.

Регистры каналов.

Каждый канал для нас – отдельный аппаратный контроллер передачи данных.

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

Каналы настолько независимы, что если вести речь обо всех регистрах контроллера DMA, то к регистрам каналов добавятся только регистры управления прерываниями.

Итак 4 регистра, с очевидным назначением.

  • DMA_CMARx — адрес памяти, по которому выполняется запись или чтение в зависимости от направления передачи данных.
  • DMA_CPARx — адрес регистра данных периферийного устройства, из которого выполняется чтение или в который производится запись. В режиме обмена данными между блоками памяти он также содержит адрес памяти.
  • DMA_CNDTRx — содержит количество элементов для передачи (количество транзакций). В качестве элемента транзакции могут быть выбраны байт, полуслово, слово.
  • DMA_CCRx — регистр конфигурации канала. Разрешает работу канала, определяет режимы передачи данных.

Полное описание регистров есть в справочнике.

Количество элементов данных для передачи устанавливается программно и может быть от 0 до 65535.

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

Что касается памяти, то как правило, необходимо записывать или считывать данные по последовательно расположенным адресам.

Для этого существует режим инкрементации адреса. Он доступен как для адреса памяти (бит MINC регистра DMA_CCRx), так и для адреса периферийного устройства (бит PINC регистра DMA_CCRx). Хотя в последнем случае не имеет смысла.

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

Размер элементов данных транзакции может иметь значения:

  • 8 бит (байт);
  • 16 бит (полуслово);
  • 32 бита (слово).

Выбор размера данных осуществляется независимо не только для каждого канала, но и отдельно для приемника и передатчика данных каждого канала. Для этого в регистре DMA_CCRx существуют битовые поля PSIZE и MSIZE.

После выполнения последней передачи запросы по каналу перестают обслуживаться. Регистр количества данных передачи DMA_CNDTRx содержит 0. Чтобы инициировать новый DMA обмен необходимо загрузить в него новое значение. Это возможно только после отключения канала. При этом все остальные регистры канала (DMA_CMARx, DMA_CPARx и DMA_CCRx) сохраняют значения.

Если задан циклический режим (бит CIRC регистра DMA_CCRx), то по окончанию передачи данных в регистр DMA_CNDTRx автоматически загружается его первоначальное значение и процесс DMA обмена возобновляется.

Конфигурация канала DMA.

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

  • Загрузить в DMA_CPARx адрес регистра данных периферийного устройства. Данные будут записываться/считываться по этому адресу после возникновения события периферийного устройства, формирующего запрос DMA.
  • Загрузить в DMA_CMARx начальный адрес блока памяти. В этот блок будут записываться данные из периферийного устройства, либо из него будут считываться данные для передачи в периферийное устройство.
  • Записать в DMA_CNDTRx общее количество элементов обмена. Каждая транзакция будет уменьшать значение этого регистра. При достижении 0, DMA передача будет остановлена.
  • Задать конфигурацию DMA передачи в регистре DMA_CCRx: направление передачи, приоритет канала, режим инкрементирования, размер элемента данных и т.д.
  • Включить канал битом EN регистра DMA_CCRx.

После этого начинают обрабатываться запросы от периферийных устройств, подключенных к каналу.

Чтением регистра DMA_CNDTRx можно узнать количество оставшихся для передачи элементов.

  • После завершения передачи половины от общего количества элементов, будет установлен флаг HTIFx в регистре DMA_ISR. Произойдет прерывание на это событие, если оно разрешено в регистре DMA_CCRx (бит HTIE).
  • После завершения передачи всех данных, будет установлен флаг TCIFx в регистре DMA_ISR. Произойдет прерывание на это событие, если оно разрешено в регистре DMA_CCRx (бит TCIE).
  • Если не задан циклический режим, то после пересылки заданного количества данных работа канала останавливается.
  • В циклическом режиме (бит CIRC регистра DMA_CCRx) после завершения передачи данных, в регистр DMA_CNDTRx автоматически перезагружается его первоначальное значение, и обмен продолжается бесконечно.

Режим “из памяти в память”.

Режим используется для копирования блоков данных в памяти.

  • Для его конфигурации необходимо установить бит MEM2MEM в регистре DMA_CCRx.
  • После включения канала битом EN регистра DMA_CCRx сразу начнется передача данных. Дополнительные запросы не требуются.

Режим запрещено использовать совместно с циклическим режимом.

Выравнивание данных разной разрядности.

При DMA передаче данных разрядности приемника и источника могут не совпадать. Действует простое и логичное правило. Всегда сохраняются младшие разряды.

  • Если разрядность источника превышает разрядность приемника, то лишние старшие разряды источника игнорируются. Например, 32х разрядное число 0x87654321 передаем в периферию с регистром данных 16 разрядов. В него запишется 0x4321.
  • Если разрядность источника меньше разрядности приемника, то недостающие старшие разряды в приемнике будут заполнены нулями. Например, 16ти разрядное число 0x4321 источника загружаем в 32х разрядный приемник. Запишется 0x00004321.

В принципе используется правило преобразования (приведения) типов данных языка C.

Специфика доступа к периферийным устройствам через шины AHB/APB.

Периферийные устройства STM32 подключены к процессору и памяти через шины AHB/APB. Это 32х разрядные шины. Они не поддерживают операций передачи меньшей разрядности. В результате в регистры периферийных устройств можно записывать или считывать из них только 32х разрядные слова.

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

При записи в периферийное устройство байта или полуслова через шину AHB данные на неиспользуемых линиях шины дублируются. Например.

  • Если мы записываем полуслово 0x4321, в регистр периферии загрузится 0x43214321.
  • Если мы записываем байт 0x21, в регистр периферии загрузится 0x21212121.
  • Но если мы укажем разрядность источника слово, т.е. запишем слово 0x87654321, а разрядность периферийного регистра укажем полуслово, то произойдет выравнивание разрядности, описанное в предыдущем абзаце. В результате в регистр загрузится 0x00004321.

Ошибки при DMA передаче.

Ошибка может возникнуть только в результате попытки доступа к зарезервированному адресному пространству. В этом случае канал, в котором произошла ошибка, отключается аппаратным сбросом бита EN. Устанавливается флаг ошибки TEIFx в регистре DMA_ISR. И формируется прерывание, если оно разрешено битом TEIE в регистре DMA_CCRx.

Прерывания DMA.

Для каждого канала могут генерироваться прерывания по следующим флагам регистра DMA_ISR.

  • HTIFx – завершена передача половины данных. Разрешается прерывание битом HTIE в регистре DMA_CCRx.
  • TCIFx — завершена передача всех данных. Разрешается прерывание битом TCIE в регистре DMA_CCRx.
  • TEIFx – ошибка передачи. Разрешается прерывание битом TEIE в регистре DMA_CCRx.

Соответствие каналов DMA периферийным устройствам.

Каналов DMA только 7. Периферийных устройств больше. Поэтому на каждый канал поступают сигналы запросов от нескольких периферийных устройств, объединенные логическим элементом ИЛИ. В каждый момент времени только одно устройство может использовать канал.

Остальные периферийные устройства должны отключить свои запросы DMA. Для этого у каждого устройства с поддержкой DMA есть специальный бит активации/деактивации формирования запроса.

Остается привести таблицу соответствия каналов DMA периферийным устройствам.

Соответствие каналов DMA периферийным устройствам STM32

На мой взгляд, контроллер DMA один из самых простых и понятных узлов STM32.

В следующем уроке будем разрабатывать программы, использующие контроллер DMA.

Подсистема прямого доступа в память МПС

Рассмотрим вариант программно-управляемого обмена между памятью и внешним устройством в МПС на базе МП i8080. Пусть необходимо передать массив данных длиной L, начиная с адреса ADR на ВУ с адресом AIO. Положим, что начальный адрес массива загружен в регистровую пару HL, а длина массива — в регистр C. Тогда фрагмент программы обмена может иметь следующий вид:
Табл. 6.1

Количество
машинных циклов

Чтение байта в Акк.

Выдача байта на ВУ

Переход, если массив не исчерпан

Таким образом, для того, чтобы в рамках процедуры копирования массива данных из памяти в ВУ переслать один байт данных потребуется десять машинных циклов (МЦ). Процессоры с более совершенной системой команд могут использовать для этой цели меньшее число МЦ, но все равно их будет более одного.
Управляя обменом, микропроцессор «ведет» два счетчика — адресов массива и количества переданных байт и формирует сигналы управления на магистраль. Если снабдить ВУ аппаратными счетчиками и схемой формирования управляющих сигналов (т.н. «канал прямого доступа в память»), то передачу одного байта (слова) можно осуществить за один МЦ без участия процессора. Необходимо лишь на время передачи данных под управлением канала ПДП блокировать работу процессора, отключив его от системной шины. Для этого служит вход захвата шины HOLD. Если подать на него высокий уровень, то МП по окончанию текущего МЦ безусловно перейдет в режим ожидания, переведя все свои выходные линии, кроме HLDA и WAIT, в высокоимпедансное состояние, а выходы HLDA и WAIT — в состояние лог. «1». Выходной сигнал HLDA используется для отключения МП от системной шины — перевода шинных формирователей, включенных между локальной и системной шиной, в высокоимпедансное состояние.
Если в МПС используется несколько ВУ, снабженных каналом ПДП, то целесообразно использовать специальный контроллер ПДП, который обеспечивает программирование каналов ПДП, подключение их к системной шине и дисциплину обслуживания.

Рис. 6.1. Типовое включение КПДП в МПС

Контроллер прямого доступа в память К580ВТ57

Микросхема К580ВТ57 предназначена для управления передачей информации между ВУ о ЗУ в режиме ПДП. Основное назначение контроллера — формирование последовательности адресов и управляющих сигналов.
Контроллер ПДП имеет четыре независимых канала обмена. Блок управления каждого канала включает два 16-разрядных регистра : регистр начального адреса РА и регистр управления РУ, причем РУ[13:0] хранит длину передаваемого массива (количество передаваемых байт), а РУ[15:14] — режим работы канала. Структурная схема контроллера и схема подключения его к МПС показана на Ошибка! Источник ссылки не найден.2.

Рис. 6.2. Контроллер прямого доступа в память

Контроллер включает в себя, помимо четырех каналов ПДП, схему управления, обеспечивающую связь с системной шиной, разрешение конфликтных ситуаций в соответствии с заданной системой приоритетов и управление работой контроллера в различных режимах.
Схема управления содержит два восьмиразрядных регистра, общие для всех каналов — регистр режимов РгР и регистр состояний РгС, причем РгР доступен процессору только по записи, а РгС только по чтению. Форматы регистров РгР и РгС показаны на Рис. 6.3.

Рис. 6.3. Форматы регистров режима и состояния
В регистре режимов разряды имеют следующий смысл:

  • AL — автозагрузка;
  • TCS — отключение канала;
  • EW — расширенная запись;
  • RP — циклический приоритет;
  • EN[3:0] — разрешение работы каналов 3..0.

В регистре состояния:

  • UF — флаг обновления;
  • TC[3:0] — конец счета в каналах 3..0.

Выводы контроллера можно разделить на две группы : (а) линии связи с ВУ и (б) линии связи с системной шиной МПС.
а)
DRQ[0:3] — запросы от ВУ (каналов) на прямой доступ в ЗУ;
DACK[0:3]\ — разрешения на ПДП внешним устройствам;
TC — конец счета, сигнал H-уровня на этом выходе отмечает последний цикл передачи блока данных;
MARK — маркер — сигнал H-уровня указывает, что до конца передаваемого блока необходимо выполнить число циклов обмена, кратное 128.
б) Линии связи с системной шиной передают стандартные сигналы управления, которые используются традиционно : RESET, READY (контроллер анализирует состояние готовности и при необходимости, как и МП, вставляет такты ожидания Tw), RDM\, WRM\, RDIO\, WRIO\, HRQ, HLDA. Контроллер синхронизируется внешним системным синхросигналом, в качестве которого чаще всего используется Ф2ттл. Сигнал ADSTB не поступает на системную шину и служит для «защелкивания» старшего байта адреса, передаваемого по шине данных в режиме ПДП (см. ниже). Сигнал AEN отмечает время действия цикла ПДП и может быть использован в системе для предотвращения захвата шины другими устройствами. Вход CS\ обеспечивает выбор микросхемы при адресной селекции.
Перед началом работы контроллера по сигналу RESET очищаются регистры всех каналов и регистр режимов РгР. Очистка РгР приводит к запрету работы всех каналов во всех режимах и предотвращает конфликты на шинах при подаче напряжения питания. Разрешение работы каналов не должны включаться, пока в регистры адресов и управления соответствующих каналов не будут загружены необходимые числа. В противном случае запрос DRQ от ВУ может вызвать циклы ПДП и порчу данных в памяти.
Контроллер ПДП может работать в двух режимах : в режиме программирования и в режиме ПДП.
В режиме программирования контроллер является пассивным устройством и процессор осуществляет с ним связь как с обычным ВУ. При этом линии A[3:0] и RDIO\, WRIO\ являются входными. Линии адреса A[2:1] при A[3] = 0 используются для селекции канала (код соответствует номеру канала), а тип регистра в канале идентифицируется разрядом A[0]: «0» — РгA, «1» — РгУ. Поскольку РгА и РгУ — двухбайтовые регистры, их загрузка осуществляется двумя циклами записи по одному адресу, причем в первом цикле передается младший байт.
При A[3:0] = 1000 осуществляется запись в РгР или чтение из РгС.
Разряды 0..3 регистра режимов РгР разрешают или запрещают работу соответствующих каналов («1» — разрешено, «0» — запрещено).
Разряд РгР[4] устанавливает тип приоритета работы каналов. При РгР[4] = 0 установлен фиксированный приоритет (канал 0 -высший, канал 3 — низший). При РгР[4] = 1 устанавливается циклический приоритет каналов. В этом режиме после каждого цикла ПДП (но не запроса) приоритет каждого канала изменяется. Канал, который только что был обслужен, получает низший приоритет, а остальные каналы — по кольцу 0 — 1 — 2 — 3 — 0 -.
Циклический сдвиг приоритетов предотвращает монополизацию одного канала; последовательность циклов ПДП будет обслуживать различные каналы, если их работа не запрещена. Все операции начинаются с присвоения каналу 0 высшего приоритета.
Разряд РгР[5] = 1 определяет режим опережающей записи. В этом случае длительность сигналов WRM\ и WRIO\ увеличивается за счет более ранней их активизации в цикле ПДП. Это в некоторых случаях позволяет обойтись без тактов ожидания Tw.
Состояние «1» в разряде РгР[6] определяет режим автоматического отключения канала по сигналу TC. Этот сигнал возникает когда РгУi[13:0] = 0; в этом случае сбрасывается бит разрешения работы активного канала и запустить его вновь в работу можно только путем программной перезагрузки РгР. При РгР[6] = 0 появление TC не запрещает дальнейшую работу канала.
При наличии «1» в РгР[7] устанавливается режим автозагрузки, позволяющий каналу 2 многократно передавать массив данных без программного вмешательства. При программировании канала 2 в этом режиме его параметры (РгА и РгУ) автоматически дублируются в соответствующих регистрах канала 3 и по сигналу TC переписываются из канала 3 в канал 2, восстанавливая первоначальное значение РгА2 и РгУ2, причем эта передача сопровождается установкой флага обновления UF в РгС[4]. Заметим, что возможности режима TCS (отключение каналов) не распространяются на канал 2 в режиме автозагрузки.
Если не запретить работу канала 3 в режиме автозагрузки, то он может работать как обычно при отсутствии запроса DRQ2. Однако, следует помнить, что работа канала 3 изменит значения параметров, которые должны передаваться в канал 2.
Перед началом работы каждый канал программируется путем занесение в РгА начального адреса массива, в РгУ[13:0] — количества передаваемых байт, а в РгУ[15:14] — режима работы канала (00 контроль, 01 — запись в ЗУ, 10 — чтение из ЗУ).
Режим контроля может использоваться ВУ для контроля принятых данных, т.к. в этом режиме не производится передача данных (не вырабатываются сигналы RDM\, RDIO\, WRM\, WRIO\), а все остальные функции ПДП сохраняются.
В режим ПДП контроллер переходит при поступлении запроса DRQ незамаскированного канала. Он вырабатывает запрос микропроцессору HRQ на захват шины и, получив подтверждение HLDA, передает сигнал активизации DACK\ выбранному ВУ и начинает циклы ПДП.
В цикле ПДП контроллер выдает содержимое РгА на линии A[7:0] (младший байт) и линии D[7:0] (старший байт в сопровождении строба ADSTB) и, в зависимости от режима работы канала, одну из пар управляющих сигналов RDM\ + WRIO\ или RDIO\ + WRM\ (в режиме контроля управляющие сигналы не выдаются). Режим ПДП завершается при снятии сигнала DRQ.

Каскадирование КПДП

Рис. 6.4. Каскадирование КПДП

Организация ПДП в IBM PC

В современных машинах используются дополнительные контроллеры ПДП, один из которых 16-ти разрядный, но также есть и 8-ми разрядные.
При программировании контроллера указываются адреса, приоритеты, регистр страниц ПДП.

Рис. 6.5. Организация ПДП в IBM PC

Контроллер 82380 выполнен в 132-выводном корпусе типа PGA и пред­ставляет собой высокопроизводительное 32-разрядное устройство, обеспечивающее прямой доступ к памяти и спроектированное специально для использования в системах на базе микропроцессора 80386. Контроллер 82380 является первым коммерческим устройством, в котором реализованы функции управления ПДП по восьми независимым программи­руемым каналам. Контроллер 82380 повышает общую пропускную способность шины микропроцессора 80386. Применение 32-разрядного интерфейса контроллера обеспечивает эффективную передачу данных и повышает скорость обслуживания системных уст­ройств ввода-вывода в 5 — 10 раз по сравнению с известными схемотехническими решениями. Эти особенности наиболее важны в системах, требующих быстродей­ствующей компьютерной техники, таких как многозадачные учрежденческие рабо­чие станции, промышленная связь и автоматизация, САПР, гибкие производствен­ные системы и системы искусственного интеллекта. Специализированная ориента­ция контроллера 82380 на особенности интерфейса микропроцессора 80386 пре­дельно минимизирует объем соответствующих логических схем.
Контроллер 82380 называют также интегрированным системным периферий­ным устройством, поскольку он выполняет ряд типовых для вычислительных систем функций, обычно реализуемых на отдельных компонентах БИС и СБИС. В состав таких средств входят

  • логические схемы системного сброса;
  • 20-уровневый программируемый контроллер прерываний (функциональное расширение программируемого контроллера прерываний 82С59А фирмы Intel);
  • четыре 16-разрядных программируемых таймера;
  • программируемый генератор с состояниями ожидания;
  • контроллер регенерации динамического ОЗУ;
  • схемы управления и арбитража внутренней шины.

Структурная схема контроллера 82380 показана на Рис. 6. . Для каждого из восьми независимых каналов передачи данных в контроллере 82380 имеется вспомогательная регистровая память, поддерживающая обмен дан­ными произвольной разрядности. Это позволяет исключить дополнительные внеш­ние цепи для. выполнения действий по выравниванию данных на определенную гра­ницу. В результате контроллер обеспечивает передачу данных между устройствами с разными размерами тракта данных по одному каналу.

Рассмотрим основные, вопросы сопряжения контроллера 82380 с микропроцессо­ром 80386 через локальную шину. Далее будет описан ряд функций, реализованных в кристалле 82380, для выполнения которых в обычных условиях требуется 20 – 30 соответствующих БИС и СБИС. Для обеспечения совместимости с существующими программными продуктами в структуре контроллера 82380 имеются побайтно доступ­ные регистры. Если внутренним логическим схемам контроллера 82380 требуется не­которая задержка до того момента, как кристалл станет доступен микропроцессору 80386, то контроллер автоматически вставит в цикл обращения необходимые такты ожидания; при этом программисту не нужно беспокоиться об этих временных ап­паратных особенностях. В структуре контроллера ПДП нашли отражение как про­граммные, так и аппаратные решения вопросов по сбросу микропроцессора 80386, а также по управлению микропроцессором, находящимся в состоянии останова.
Контроллер 82380 может работать как в режиме ведущего устройства, так и в подчиненном режиме. Поскольку после системного сброса контроллер ПДП пере­ходит в подчиненный режим, то для системы он представляется как устройство ввода-вывода. В подчиненном режиме контроллер 82380 отслеживает состояние микропроцессора 80386 и отрабатывает каждую команду в установленном порядке. Выполняя функцию управления ПДП, контроллер следит за состоянием потока ад­ресов для устройства, к которому происходит обращение, и добавляет необходимое число тактов ожидания в цикл обращения. При выполнении операций передачи с ПДП контроллер работает в привилегированном режиме как ведущее устройство на шине.

Интерфейс с главным процессором

Контроллер 82380 подключен непосредственно к локальной шине микропроцес­сора 80386, поэтому назначение его управляющих сигналов такое же, как у 80386. Контроллер 82380 отслеживает текущее состояние микропроцессора 80386 как по его сигналам состояния, так и по сигналам на своих выводах ADS* и READY*. На основании этой информации контроллер определяет, выполняются конвейерные или неконвейерные действия в текущем цикле шины.

Рис. 6.6. Архитектура контроллера 82380

Контроллер 82380 может управлять доступом к 8-разрядным периферийным ус­тройствам с целью обеспечения совместимости с существующими архитектурами систем и программными продуктами. При этом данные размещаются на линиях шины D0 — D7 или D8 — D15. В подчиненном режиме контроллер только при­нимает данные по указанным линиям. Благодаря возможности контроллера 82380 обращаться к байтам программист может иметь доступ к регистрам контроллера, пользуясь при этом холостыми командами NOP для организации ожидания сраба­тывания менее быстродействующих внутренних регистров 82380. В подчиненном режиме 82380 контролирует линии состояния и управления центрального процес­сора, отрабатывая логику шины микропроцессора 80386 и добавляя требуемое чис­ло тактов ожидания.
В режиме ведущего работа контроллера 82380 полностью согласуется с работой микропроцессора 80386. Например, данные передаются и принимаются контролле­ром точно так же, как микропроцессором 80386. Для остальной части системы и любого подключенного периферийного устройства контроллер 82380 выглядит как микропроцессор 80386. Это значит, что при разработке систем на базе данного кон­троллера нет необходимости видоизменять интерфейс с уже существующими пери­ферийными устройствами. Механизм обращения контроллера 82380 к любому периферийному устройству на шине остается таким же, как у микропроцессора 80386; дополнительно контроллер выявляет конвейерные циклы шины.
Адреса всех регистров данных, управления и состояния контроллера 82380 фик­сированы относительно друг друга. Эти регистры могут быть отображены на соот­ветствующие ячейки либо оперативной памяти, либо пространства ввода-вывода.

На Рис. 6.7 показана структура 32-разрядного восьмиканального контроллера ПДП в составе кристалла 82380. При проектировании контроллера ставилась зада­ча эффективной передачи произвольных комбинаций байтов, слов и двойных слов. С помощью контроллера ПДП можно адресовать полное пространство, покрываемое 32-разрядными физическими адресами, а также увеличивать и уменьшать адреса как операндов-источников, так и операндов назначения.
Рис. 6.7. Контроллер ПДП в 82386
С помощью внутреннего вспомогательного 32-разрядного регистра можно выполнять разборку и сборку дан­ных разной разрядности, а также организовывать обмен данными между устройст­вами, имеющими разную ширину тракта данных. При работе контроллера 82380 на частоте 20 МГц и при передаче данных одинаковой разрядности может быть достигнута скорость обмена между памятью и устройствами ввода-вывода 25,6 Мбайт/с.
В порядке обслуживания как программных, так и аппаратных запросов ПДП контроллер может поддерживать обмен данными следующих типов:

  • порт ввода-вывода — порт ввода-вывода;
  • память — память;
  • порт ввода-вывода — память;
  • память — порт ввода-вывода.

Семь из восьми каналов (все, за исключением канала 4) имеют доступ к ап­паратным сигналам подтверждения ПДП через трехразрядную шину подтверждения ПДП (линии от EDACK0 до EDACK2).
Каждый из восьми каналов контроллера ПДП 82380 функционирует независи­мо один от другого и может быть запрограммирован для работы в любом из допу­стимых режимов. Регистры каждого канала можно разделить на три класса: регистры счетчика байтов, регистры инициатора запроса и. целевые регистры; всего в канале имеется 24 регистра состояний и команд. С помощью этих регистров оп­ределяются адреса и объем пересылаемых данных. Регистр счетчика байтов (24 раз­ряда) содержит значение числа байтов, которые должны быть переданы. Регистр инициатора запроса (32 разряда) содержит адрес порта ввода-вывода или памяти, где находятся данные, по которым был сделан запрос контроллеру на обслуживание ПДП; целевой регистр (32 разряда) содержит адрес порта ввода-вывода или памя­ти, по которому будут пересылаться данные.
Для каждого канала программист может выбирать дисциплину обслуживания с циклическими или фиксированными приоритетами. Циклический приоритет пре­дусматривает разделение шины среди нескольких периферийных устройств, тогда как дисциплина с фиксированными приоритетами основана на определенных фик­сированных параметрах, связанных с аппаратными и другими особенностями. В дисциплине с фиксированными приоритетами допускается, чтобы программист при­сваивал любому каналу низший приоритет, что позволит без перепрограммирования командных регистров изменять или приводить в исходное состояние расписание об­служивания приоритетов.
Каналы контроллера ПДП разделены на две группы по четыре канала — ниж­нюю и верхнюю. Нижние (от нулевого до третьего) и верхние (от четвертого до седьмого) каналы работают так, будто два отдельных контроллера ПДП включены по каскадной схеме. Такая организация работы позволяет одной группе присваивать фиксированные приоритеты, а другой — циклические, причем в различных ком­бинациях. По умолчанию каналы контроллера ПДП 82380 имеют фиксированные приоритеты, при этом высшим приоритетом обладает нулевой канал, низшим — седьмой. Нижняя группа играет своеобразную роль канала 5 в верхней группе и по порядку приоритетов располагается между каналами 7 и 4.
Как уже отмечалось, программисту предоставлена возможность по своему ус­мотрению выбирать, какому из каналов назначить низший приоритет. С помощью специальных команд определяется канал с самым низким приоритетом в пределах какой-либо группы, при этом остальным каналам присваиваются фиксированные приоритеты в последовательном порядке. Например, если низший приоритет при­своен каналу 1 в нижней группе, то порядок каналов по приоритетам будет сле­дующий: 2 (высший приоритет), 3, 0, 1 (низший приоритет). Как видно, каналу, порядковый номер которого следует сразу же за номером выбранного канала с ни­зшим приоритетом (в данном случае за номером 2), устанавливается самый высо­кий приоритет и так далее с убыванием приоритета по мере последовательного циклического в рамках группы возрастания номеров каналов, пока не будет достиг­нут номер выбранного наименее приоритетного канала (в данном случае номер 1). То же относится и к верхней группе каналов. Так, если низший приоритет при­своен каналу 6, то приоритеты верхней группы составят следующий ряд: 7 (высший приоритет), 4—6 (низший приоритет). Еще раз напоминаем, что нижняя группа по приоритету располагается между каналами 4 и 7. Поэтому по данным рассмот­ренных выше примеров комбинация двух групп даст следующий порядок каналов: 7 (высший приоритет), [2, 3, 0, I], 4, 5, 6 (низший приоритет).
Контроллер ПДП может принимать команды программного управления приори­тетами только тогда, когда группа каналов, к которой относятся эти команды, на­ходится в режиме с фиксированными приоритетами. При переходе к дисциплине с циклическими приоритетами все текущие уровни приоритетов остаются без из­менений. При возврате от дисциплины с циклическими приоритетами к дисциплине с фиксированными приоритетами для уровней приоритетов каналов с помощью команд программного управления приоритетами восстанавливаются те значения, которые были в последний раз установлены программным образом.
Для дисциплины с циклическими приоритетами любой канал после обслужива­ния его запроса не остается с высшим приоритетом. Этому каналу присваивается низший приоритет. Следует помнить, что номера приоритетов нижней группы (в предыдущем примере 2, 3, 0, 1) меняются циклически в пределах верхней группы приоритетов (в предыдущем примере 7, [нижняя группа], 4 – 6). Поэтому обслу­живание канала из нижней группы сопровождается циклическим изменением но­меров уровня приоритета как в нижней, так и в верхней группах.
Такие команды, как «сброс запроса прерывания по завершении счета», «сброс режима ведущего устройства», «очистка регистра маски» и «сброс триггера указате­ля байтов», активизируются в результате распознавания контроллером ПДП 82380 соответствующего адреса порта. При этом в выбранный порт должны быть записаны какие-нибудь данные.
Контроллер ПДП 82380 реализует передачу блоков данных в одном из следую­щих режимов: режим одиночного буфера, буферный режим с автоинициализацией и режим с цепочкой буферов. Первый режим используется обычно в тех случаях, когда к моменту начала передачи известны объем и местоположение передаваемых данных, а данные размещены в непрерывной области памяти. Для данного режима характерно, что по завершении передачи одиночного блока контроллер ПДП дол­жен перепрограммироваться для других передач даже этого же блока. В буферном режиме с автоинициализацией, напротив, допускается неоднократная передача контроллером ПДП одного и того же блока данных без перепрограммирования ка­нала всякий раз.
В режиме с цепочкой буферов допускается, чтобы в программе был определен список буферов, содержимое которых передается, при этом для перепрограммирования контроллера ПДП используются программы обработки прерываний. Канал для передачи содержимого нового буфера программируется до того, как закончится передача содержимого текущего буфера. В данном режиме контроллер ПДП может работать с разрывными областями памяти и передавать все данные из этих областей за один рабочий процесс ПДП.

Программируемый контроллер прерываний

Рассмотрение функций контроллера 82380 продолжим с помощью Рис. 6.8. Функционально программируемый контроллер прерываний идентичен своим пред­шествующим моделям 8259А и 82С59А, за исключением программирования векто­ров прерываний. В контроллере 82380 объединены ресурсы трех контроллеров типа 82(С)59А. Каскадируя пятнадцать входов запросов прерываний контроллеров 82С59А, имеющихся в распоряжении программиста, можно организовать до 120 каналов запросов внешних прерываний. Хотя контроллеры могут работать в режиме ведущего устройства, приоритет отдается каскадному режиму.
В контроллере прерываний 82380 имеются более широкие возможности по ис­пользованию механизма векторов прерываний, поскольку каждый вход запроса пре­рываний может отдельно программироваться. Это значит, что каждому запросу пре­рываний может быть предписан свой собственный вектор прерывания; кроме того, системные программы по умолчанию могут присвоить контроллеру прерываний 82380 определенный вектор. Этот вектор используется в цикле подтверждения не­запрашиваемых прерываний или прерываний, вызванных ошибочным запросом, с целью предупреждения системы о ложных прерываниях. С помощью прерывания система также информируется о том, что предпринята попытка запрограммировать векторы контроллера 82380 по методу контроллера 82С59А. Эта особенность гаран­тирует совместимость существующих программных продуктов с программным обес­печением, написанным для 82380. К другим усовершенствованиям контроллера пре­рываний 82380 относится возможность каскадного подключения внешних контрол­леров прерываний, а также то, что квитирование установления связи между веду­щим и ведомым устройствами вынесено из специализированных каскадных линий на шину данных.
На рис. 11.3 показаны пять основных блоков контроллера прерываний:

  • регистр запросов прерываний (IRR);
  • блок разрешения приоритетов (PR);
  • служебный регистр (ISR);
  • регистр маски (IMR);
  • регистр векторов (VR).

Рис. 6.8. Структурная схема контроллера прерываний

Всеми прерываниями управляют каскадно включенные регистры запроса преры­ваний IRR и служебный регистр ISR. В регистре IRR фиксируются уровни всех прерываний, требующих обработки, а в регистре ISR — уровни всех прерываний, проходящих обработку. Во время цикла подтверждения прерывания с помощью блока разрешения приоритетов определяются приоритеты запросов по содержимому регистра IRR, а для прерываний с высшим приоритетом в регистре ISR помечаются соответствующие разряды. Регистр маски прерываний IMR используется совместно с регистром IRR и хранит код, по которому будут маскироваться определенные ли­нии прерываний. Маскирование входов с более высоким приоритетом не влияет на линии запросов прерываний с низшим приоритетом. Номера предварительно за­программированных векторов прерываний записываются в набор векторных регист­ров VR, для каждой линии запроса прерывания определен свой векторный регистр. Во время цикла подтверждения прерывания контроллера 82380 номер вектора, со­ответствующий выбранному прерыванию, выставляется на шину данных.

Оглавление
  • Главная страница
  • Обучающая часть
  • Оглавление
  • Общая структура МПС
  • Принципы устройства современных МПС
  • Передача информации в МПС
  • Методы ввода/вывода и их классификация
  • Подсистема прерываний МПС
  • Подсистема прямого доступа в память МПС
  • Подсистема памяти МПС
  • PCI
  • Микропроцессоры и микроконтроллеры
  • Цифровая обработка сигналов DSP (digital signal processor)

Контроллер прямого доступа к памяти

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

Контроллер DMA — Используется для уменьшения нагрузки на центральный процессор в случае длительного обмена большим потоком данных с устройствами. К таким устройствам могут быть причислены:

  • Жёсткие диски (IDE, ATA, SCSI ).
  • Приводы для гибких магнитных накопителей ( CD , PCI Bus Master . ISA DMA — старый контроллер DMA, который описан ниже. В современные ПК устанавливаются два контроллера DMA:
    • 8-битный (каналы 0, 1, 2, 3).
    • 16-битный (каналы 4, 5, 6, 7).

    В данном случае разрядность контроллера указывает режим передачи данных (8-битный, 16-битный).

    Среди этих восьми каналов наиболее часто используются:

      Канал 2 — для работы с гибкими дисками ( Порты [ ]

    • CAR (Current Address Register) — регистр текущего адреса ячейки памяти, используемой в данный момент для выполнения операции обмена данными.
    • CWR (Current Word Register) — регистр счётчика слов, подлежащих передаче минус один.
    • PAR (Page Address Register) — регистр адреса страницы, служит для задания старших разрядов адресов (4 бита для DMA-1 и 8 бит для DMA-2).
    • BAR (Base Address Register) — регистр базового адреса буфера (смещение), с которым осуществляется обмен данными. Служит для начальной загрузки значения в регистр CAR.
    • BWCR (Base Word Count Register) — регистр базового числа циклов DMA (общее число передаваемых слов минус единица), служит для начальной загрузки значения в регистр CWR.

    Фактически, регистр CAR имеет тот же адрес, что и BAR, а CWR — тот же, что BWCR. Отличие cостоит в том, что доступ к CAR и CWR осуществляется только при чтении данных из портов, а к BAR и BWCR — только при записи данных в порты.

    Весь список портов регистров DMA для каналов можно представить следующей таблицей:

    Номер канала BAR(w)/CAR(r) BWCR(w)/CWR(r) PAR(rw)
    0 0x00 0x01 0x87
    1 0x02 0x03 0x83
    2 0x04 0x05 0x81
    3 0x06 0x07 0x82
    4 0xc0 0xc2 n/a
    5 0xc4 0xc6 0x8a
    6 0xс8 0xca 0x89
    7 0xcc 0xce 0x8b

    Помимо этого, у каждого контроллера DMA есть свой набор регистров только для записи:

    DMA-1 DMA-2 Описание
    0x08 0xd0 управляющий регистр контроллера DMA
    0x09 0xd2 регистр программного запроса контроллера DMA
    0x0a 0xd4 регистр маскирования канала
    0x0b 0xd6 регистр установки режима работы канала
    0x0c 0xd8 сброс триггера байтов
    0x0d 0xda сброс контроллера
    0x0e 0xdc сброс регистра маски контроллера
    0x0f 0xde регистр для одновременной записи масок всех каналов контроллера

    Управляющий регистр CR (Command Register) задаёт параметры работы контроллера DMA, общие для всех каналов микросхемы. Регистр представляет собой следующую структуру:

    • бит 7 — уровень сигнала подтверждения DACK (1 — высокий, 0 — низкий).
    • бит 6 — уровень сигнала подтверждения DREQ (1 — высокий, 0 — низкий).
    • бит 5 — цикл записи (1 — расширенный, 0 — задержанный).
    • бит 4 — приоритеты (1 — циклически меняются, 0 — фиксированы).
    • бит 3 — сжатие цикла по времени.
    • бит 2 — управление работой контроллера (1 — запрещена, 0 — разрешена).
    • бит 1 — разрешение захвата канала 0 для режима память/память.
    • бит 0 — режим работы (0 — обычный, 1 — память/память).

    Регистр программного запроса RR (Request Register) имеет вид:

    • биты 7-3 — не используются.
    • бит 2 — запрос на DMA (0 — сбросить, 1 — установить).
    • биты 1-0 — номер канала.

    Регистр маскирования канала CMR (Channel Mask Register) позволяет временно блокировать сигнал запроса на обслуживание (DREQ) для определённого канала. Содержимое регистра представляется следующим образом:

    • биты 7-3 — не используются (должны быть равны нулю).
    • бит 2 — запрос на DMA (0 — сбросить, 1 — установить).
    • биты 1-0 — номер канала.

    Регистр установки режима работы MR (Mode Register) позволяет задать режим работы канала:

    • биты 7-6 — режим обслуживания:
      • 00 — передача по требованию.
      • 01 — одиночная передача.
      • 10 — блочная передача.
      • 11 — каскадирование.
      • 00 — тарификация.
      • 01 — запись.
      • 10 — чтение.
      • 11 — запрещённая комбинация.

      Регистр сброса триггера байтов предназначен для сброса переключателя младший/старший разряд для чтения или записи 16-битных значений из/в 8-битные порты 0x00-0x08. Очередной байт, переданный в эти порты, будет счиаться младшим, а следующий за ним — старшим.

      Регистр сброса контроллера предназначен для сброса контроллера DMA, который осуществляется при записи любого значения в соответствующий ему порт.

      Сброс регистра маски контроллера предназначен для снятия маскирующих битов со всех каналов одновременно. Операция осуществляется записью любого значения в этот регистр.

      Регистр одновременной записи всех масок каналов WAMR (Writa All Mask Register) предназначен для одновременного изменения масок всех каналов контроллера. Регистр имеет вид:

      • биты 7-4 — зарезервированы (0).
      • бит 3 — маскирование канала 3.
      • бит 2 — маскирование канала 2.
      • бит 1 — маскирование канала 1.
      • бит 0 — маскирование канала 0.

      Регистр состояния SR (Status Register) имеет те же номера портов, что и регистр CR, но доступен только для чтения. Формат регистра следующий:

      • бит 7 — обслуживание канала 3 разрешено.
      • бит 6 — обслуживание канала 2 разрешено.
      • бит 5 — обслуживание канала 1 разрешено.
      • бит 4 — обслуживание канала 0 разрешено.
      • бит 3 — конечный отсчёт по каналу 3 достигнут.
      • бит 2 — конечный отсчёт по каналу 2 достигнут.
      • бит 1 — конечный отсчёт по каналу 1 достигнут.
      • бит 0 — конечный отсчёт по каналу 0 достигнут.

      Функции [ ]

      Пример маскирования канала DMA:

      int DMAMasks; // В DMAMasks хранится информация о маскировании всех 8 каналов DMA void SetDMAMask(int channel)  DMAMasks |= (1<channel); if (channel>=4) outportb(0xde, DMAMasks>>4); // используется WAMR DMA-2 else outportb(0x0f, DMAMasks&0x0f); // используется WAMR DMA-1 > 
      void ClearDMAMask(int channel)  DMAMasks &= (~(1<channel)); if (channel>=4) outportb(0xde, DMAMasks>>4); else outportb(0x0f, DMAMasks&0x0f); > 

      Сброс триггера байтов:

      void ClearDMAByteTrigger(int channel)  if (channel4) outportb(0x0c, 0xaa); // всё равно какое значение писать else outportb(0xd8, 0xaa); // всё равно какое значение писать > 

      Установка режима работы DMA:

      void SetDMAWorkMode(int channel, int mode)  int chan=channel&0x07; // chan - номер канала, mode - режим if (chan4) outportb(0x0b, ((mode&0xfc)|(chan&0x3))); else outportb(0xd6, ((mode&0xfc)|(Chan&0x3))); > 

      Пример записи адреса буфера для канала 2 контроллера DMA-1:

      void SetDMABufferAddress_ch2(int address)  // триггер байтов должен быть сброшен outportb(0x04, address); outportb(0x04, address>>8); outportb(0x81, address>>16); > 

      Пример установки счётчика слов для канала 2 контроллера DMA-1:

      void SetDMACycles_ch2(int cycles)  // триггер байтов должен быть сброшен int counter=cycles-1; outportb(0x05, counter); outportb(0x05, counter>>8); > 

      Пример инициализации канала DMA контроллера

      // подготовка канала 2 к приёму данных от FDC SetDMAMask(2); // маскировать канал на время операций ClearDMAByteTrigger(2); // сбросить триггер байтов для канала 2 SetDMAWorkMode(2, 0x44); // установить режим работы - запись в буфер SetDMABufferAddress_ch2(0x20000); // буфер находится по физическому адресу 0x20000 SetDMACycles_ch2(512); // 512 = размер сектора диска ClearDMAMask(2); // размаскировать канал 2 // подача команды контроллеру на чтение сектора 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *