Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Лабораторная работа №6
Обработка прерываний в реальном режиме работы микропроцессоров Intel семейства x86
6.1. Цель работы: получение навыков управления аппаратурой через программирование портов ввода/вывода и навыков создания обработчики аппаратных и программных прерываний. 6.2. Теоретические сведения. Устройства ввода информации сообщают центральному процессору о поступлении новых данных с помощью сигналов прерываний. Сигнал прерывания от таких периферийных устройств прежде чем попасть в процессор, проходит контроллер прерываний, где подвергается предварительной обработке. Контроллер позволяет управлять приоритетами, прохождением сигналов и адресами векторов прерываний. Контроллер прерываний IBM AT состоял из двух микросхем Intel 8259a, включенных в режиме каскадирования (рис. 6.1).
Подсистема прерываний компьютера на базе микропроцессора Intel
Рис. 6.1 На входы IRQ0, IRQ1, IRQ3-IRQ7 ведущий микросхемы и на входы IRQ8-IRQ15 ведомой поступают запросы прерываний, из которых выбирается немаскируемый запрос с наивысшим приоритетом, после чего контроллер вырабатывает сигнал INT и передает в процессор вектор прерывания. Вектор формируется путем сложения базового значения (записанного в соответствующий) регистр микросхемы) и номера линии, на которую поступил запрос (ведущей микросхеме IRQ0 соответствует линия 0, IRQ7 – линия 7; ведомой микросхеме IRQ8 соответствует линия 0, IRQ15 – линия 7). Базовый вектор ведущий микросхемы в реальном режиме DOS имеет значение 08h, базовый вектор ведомой – 70h. Соответственно ведущая микросхема вырабатывает вектора с номерами 08-0Fh, ведомая - с номерами 70-77h (табл. 6.1). Приоритеты запросов располагаются в следующем порядке: IRQ0, IRQ1, IRQ8-IRQ15, IRQ3-IRQ7. Все последующие модели AT-совместимых компьютеров вынуждены имитировать работу микросхем i8259A с целью сохранения совместимости со старым программным обеспечением. Приоритеты прерываний, поступающих от периферийных устройств и адреса соответствующих векторов устанавливаются BIOS в процессе начальной загрузки и являются фиксированными. Полностью перепрограммировать контроллер приходится при переходе в защищенный режим, так как при этом необходимо изменить номера векторов прерываний. Работа с контроллером в обычном реальном режиме DOS требует выполнения только двух типов операций: - маскирования и размаскирования прерываний по отдельным линиям; - посылки сигнала завершения обработки прерывания контроллеру. Внутренняя структура ПКП представлена на рис. 6.2.
Таблица 6.1 Аппаратные прерывания AT-совместимых компьютеров
Функциональное назначение выводов ПКП i8259a следующее: D7…D0 – выводы, замыкающиеся на системную шину данных. По ним приходит управляющая информация в ПКП и на них формируется номер ветора прерывания. IRQ7…IRQ0 – выводы, на которых поступают запросы от таких внешних устройств, как таймер, клавиатура и т.д. INT – вывод на котором ПКП формирует единый запрос на прерывание. Этот вывод соединен с выводом INTR мп. INTA – вывод на который от мп поступает сигнал подтверждения получения запроса на прерывание. Этот вывод соединен с одноименным выводом INTA мп.
D7 …. D0
IRQ7 …. IRQ0 INT INTA
Рис. 2.2 Упрощенная внутренняя структура ПКП i8259A
Функциональное назначение блоков, входящих в состав ПКП: IRR (Interrupt Request Register) – регистр фиксирования запросов на прерывание. Фиксация запроса будет заключаться в установке соответствующего бита регистра IRR в единицу. Например, если поступил запрос на прерывание по линии irq0, то установлен в единицу будет нулевой бит регистра IRR (IRR.0=1). IMR (Interrupt Mask Register) – регистр маскирования обработки запросов на прерывания. С помощью бит этого регистра можно запретить (замаскировать) обработку прерываний определенных уровней. Запрет осуществляется установкой соответствующего бита регистра IMR в единицу. Например, если IMR.1=1, то прерывания уровня irq1 запрещены к обработке. PR (Priority Resolver) – арбитр приоритетов. Функцией данного блока является разрешение конфликтов при одновременном приходе запросов на прерывание на входы IRQ7…IRQ0. ISR (Interrupt Service Register) – регистр обслуживаемых прерываний. Установленные в единицу биты этого регистра показывают прерывания каких уровней в данный момент времени обслуживаются мп. Программирование i8259a осуществляется через адресное пространство портов ввода/вывода. Для программирования ведущего контроллера используются два 8-разрядных порта с номерами 20h и 21h. Для программирования ведомого контроллера используются два 8-разрядных порта с номерами A0h и A1h. Программирование осуществляется путем посылки в эти порты, в определенной последовательности, так называемых, управляющих слов. Существует два типа таких слов: ICW (Initialization Control Word, управляющее слово инициализации) и OCW (Operation Control Word, операционное управляющее слово). Существуют четыре слова инициализации – ICW1, ICW2, ICW3, ICW4 и три операционных управляющих слова – OCW1, OCW2, OCW3. Управляющее слово ICW1 для ведущего ПКП посылается в порт 20h, для ведомого – в порт A0h и имеет следующий формат: № бита Назначение a. 0 – управляющего слова ICW4 не будет в данной последовательности приказов b. - управляющее слово ICW4 будет в данной последовательности приказов.
Чтобы запретить прерывание необходимо установить в 1 соответствующий ему бит в регистре маски (номера разрядов маски соответствуют номерам линий сигналов прерывания). Поскольку в маске требуется изменить лишь один разряд, а остальные нужно сохранить в исходном состоянии, то сначала требуется прочитать содержимое регистра маски, выполнить операцию изменения соответствующего разряда, а затем записать полученное значение обратно в регистр маски. Между двумя последовательными обращениями к одному и тому же порту рекомендуется вставлять циклы задержки, поскольку контроллер по сравнению с процессором работает слишком медленно. Регистр маски прерываний ведущего контроллера доступен для записи и считывания через порт 21h, ведомого контроллера через порт A1h. Например, чтобы запретить прохождение сигнала прерывания от клавиатуры IRQ1 (ведущий контроллер, линия №1), нужно выполнить следующий ряд команд: in al, 21h; чтение содержимого регистра маски or al, 10b; маскирование прерывания по линии IRQ1 jmp short $+2; задержка jmp short $+2; задержка out 21h, al; запись маски обратно в регистр Когда требуется создание собственного обработчика прерывания, то требуется проделать обратную операцию – размаскировать линию прерывания от соответствующего устройства. Например, для драйвера мыши PS/2-типа, обрабатывающего прерывание IRQ12 (ведомый контроллер, линия №4), участок кода в котором выполняется размаскирование выглядит следующим образом: in al, 21h; чтение содержимого регистра маски or al, 11101111b; обнулить четвертый разряд маски jmp short $+2; задержка jmp short $+2; задержка out 21h, al; запись маски обратно в регистр Обработка сигналов прерывания происходит следующим образом. Вначале выполняется проверка маски, и если сигнал не запрещен, то происходит проверка его приоритета. Если нет других сигналов или данный запрос имеет наивысший приоритет, то контроллер посылает микропроцессору сигнал запроса INT. Если маскируемые прерывания разрешены (установлен флаг IF в регистре eflags), то процессор выдает контроллеру сигнал INTA. После получения сигнала INTA контроллер выдает процессору номер вектора прерывания и переводит запрос в разряд обслуживаемых (соответствующий бит в регистре поступивших запросов контроллера сбрасывается, а бит в регистре обслуживаемых прерываний устанавливается). Процессор начинает обработку прерываний с того, что записывает в стек содержимое регистров флагов и сбрасывает флаг IF. В результате в момент начала обработки прерывания все маскируемые прерывания в процессоре запрещены, а контроллер не пропускает запросы прерываний, приоритеты которых ниже, чем у запроса, обрабатываемого процессором. Кроме того, следующие прерывания от устройства, запрос которого поступил на обработку, также будут заблокированы контроллером. Процессор должен разрешить обработку маскируемых прерываний (установить флаг IF командой STI), как только будет выполнен критический участок кода процедуры обработки прерывания, т.е. группа операций, которую прерывать нельзя. Часто процедура вообще не содержит критических участков, и тогда команду STI следует установить в самом начале обработчика прерывания. С другой стороны, весь код процедуры может не допускать прерывания: в этом случае команда STI не используется, а флаг прерывания автоматически восстанавливается при выходе из процедуры по команде IRET. Разрешить контроллеру обрабатывать прерывания с таким же или более низким приоритетом следует как можно раньше, чтобы не возникла угроза потери информации от низкоприоритетных устройств. Как только будет завершен участок кода, не допускающий повторного прерывания от того же устройства, необходимо послать контроллеру команду EOI (End of Interrupt). Регистр команд ведущий микросхемы доступен для записи через порт 20h, регистр команд ведомой – через порт A0h. Например, в процедуру обработчика прерывания от клавиатуры обязательно должна быть включена последовательность команд: mov al, 20h; записать в регистр al код команды EOI out 20h; послать команду EOI в ведущий контроллер Прерывание, поступившие через ведомую микросхему, блокирует также и обработку всех прерываний с более низкими приоритетами в ведущий. Поэтому процедура обработки такого прерывания должна посылать команду EOI не только в ведомую, но и ведущую микросхему: mov al, 20h out 0A0h, al out 20h, al К входу IRQ0 подключен нулевой канал системного таймера. В обработчике прерывания таймера 08h предусмотрена возможность вставки пользовательского кода. С этой целью из системной обработки прерывания делается вызов еще одного прерывания с номером 1ch. Это пустое прерывание обработчик которого всего содержит одну команду iret. Таким образом, проблема сцепления пользовательского обработчика может быть решена косвенно, заменой вектора обработчика прерывания 1сh. Таймер в своем составе имеет три канала с одинаковой внутренней структурой. На каналы таймера подаются импульсы от микросхемы системных часов, представляющих генератор импульсов, работающий с частотой 1.19 МГц. Каждый канал имеет два входа и один выход. Канал 1 связан с микросхемой прямого доступа к памяти (DMA). Канал 2 выходит на динамик компьютера. Основу канала составляют три регистра: 8-разрядный регистр ввода-вывода, 16-разрядный регистр защелка (latch register) и 16-разрядный регистр счетчик. В регистр ввода-вывода системным программным обеспечением или программой пользователя помещается некоторое значение. Каждый регистр ввода-вывода имеет адрес в адресном пространстве ввода-вывода. Регистр ввода-вывода 2 канала имеет номер порта ввода-вывода 42h. Помещаемое в его значение будет немедленно передано в регистр-защелку, где значение будет сохраняться до тех пор, пока в регистр ввода-вывода не будет записано новое значение. Регистр управления (порт 43h) содержит слово состояние, с помощью которого производится выбор канала, задание режима работы канала и тип операции передачи значения в канал. Слово состояние имеет следующий формат - бит 0 определяет тип константы пересчета: 0 – константа задана двоичным числом, 1 – BCD числом. - биты 1-3 определяют режим работы таймера. Всего существует 6 режимов. Обычно используется 3. Соответственно значение поля – 011 - биты 4-5 определяют тип операции: 00 – передать значение счетчика в регистр-задвижку; 01 – записать в регистр задвижку только младший байт; 10 – записать в регистр-задвижку только старший байт; 11- записать в регистр-задвижку, сначала старший,, а затем младший байт. - биты 6-7 определяют номер программируемого канала Для формирования любого звука необходимо задать его длительность и высоту. После того как значение из регистра ввода-вывода попало в регистр защелку, оно переписывается в регистр-счетчик. Сразу после этого значение регистра-счетчика начинает уменьшаться на единицу с приходом каждого импульса системных часов. На выходе любого из трех каналов таймера стоит элемент И. Значение регистра-счетчика участвует в формировании сигнала на одном из входов элемента И. Когда содержимое регистра-счетчика становится равным нулю, на входе элемента И формируется логическая 1. Сигнал на другом входе зависит от состояния бита 0 регистра программируемого периферийного интерфейса i8255 (порт 61h). Одновременно с пропуском импульса в канале 2 немедленно производится загрузка содержимого регистра-защелки (которое не изменилось, если его не изменили извне) в регистр-счетчик. Весь процесс с уменьшением содержимого регистра-счетчика повторяется заново. Чем меньшее число загружено в регистр-защелку, тем чаще будет происходить обнуление счетчика, и тем чаще импульсы будут проходить на выход второго канала. Это, в свою очередь означает, что высота звука будет выше. Импульс с выхода второго канала таймера попадает на динамик, и если на последний подан ток, то возникнет звук. Подачей тока на динамик управляет бит 1 порта 61h. Выполняя разрывы в подаче тока, можно определять длительность звучания.
6.3. Программа работы В соответствии с номером варианта написать программу. В каждой процедуре обработке прерывания обрабатывать только один элемент массива или выводить один элемент числовой последовательности.
1. Перехватив прерывание от таймера вывести на экран последовательностью квадратов натуральных чисел. Заполнение прекратить, когда числа выйдут за пределы 16-разрядной сетки. 2. Перехватив прерывание от таймера вывести на экран последовательность чисел Фибоначчи 1, 1, 2, 3, 5, 8, 13, 21…. Заполнение прекратить, когда числа выйдут за пределы 16-разрядной сетки. 3. Перехватив прерывание от таймера вывести последовательность чисел 0, 1, 2, …, 255 на экран. 4. Дан массив A из 10 однобайтовых чисел. Перехватив прерывание от таймера вывести на экран со сдвигом на один разряд влево только числа, содержащие четное количество единиц. 5. Дан массив A из 10 однобайтовых чисел. Перехватив прерывание от таймера вывести на экран со сдвигом на один разряд вправо только числа, содержащие нечетное количество единиц. 6. Дан массив A из 10 однобайтных чисел. Перехватив прерывание от таймера вывести из массива А на экран все числа, большие 05h и меньшие 20h. 7. Перехватив прерывание от таймера вывести на экран последовательность степеней числа 2. Вывод прекратить, когда числа выйдут за пределы 16-разрядной сетки. 8. Дан массив A из 10 однобайтовых чисел. Перехватив прерывание от таймера проверить есть ли в нем число 10h, если оно есть, выполнить сложение всех чисел массива А и вывести сумму на экран. 9. Дан массив A из 10 однобайтовых чисел. Перехватив прерывание от таймера вывести на экран все числа большие 20h и подсчитать сумму таких чисел и также вывести ее на экран. 10. Перехватив прерывание от таймера вывести на экран последовательность степеней числа 3. Вывод прекратить, когда числа выйдут за пределы 16-разрядной сетки. 11. Перехватив прерывания от таймера вывести последовательность факториалов натуральных чисел. Заполнение прекратить, когда числа выйдут за пределы 16-разрядной сетки. 12. Перехватив прерывание от таймера вывести на экран последовательность a, b, c, d, e, f. 13. Перехватив прерывание от таймера вывести на экран последовательность 1, 2, 3, 4, 5, 6, 7. После возврата старого значения вектора с номером 1Ch вызвать программное прерывание с номером вектора 0FFh, обработчик которого выдавал бы циклически понижающийся и повышающийся звук на динамике компьютера. Число циклов должно соответствовать номеру варианта, т.е. для 1 варианта – 1; для второго – 2 и т.д.
Вопросы к защите. Определение вектора прерывания. Формат вектора прерывания. Упрощенная внутренняя структура ПКП i8259a. Режимы работы ПКП. Формат управляющих слов инициализации ICW1, ICW2, ICW3, ICW4. Формат операционных управляющих слов OCW1, OCW2, OCW3. Упрощенная схема обработки аппаратных прерываний в ВМ c процессорами Intel семейства х86.
|