- [0] RU.HACKER (2:5025/35.3) --------------------------------- RU.HACKER - From : Igor B. 2:5030/207.70 04 Oct 96 12:05:30 Subj : IRQ --------------------------------------------------------------------------- AD> Очень нyжно yметь опpеделять что на каком IRQ весит и какие AD> IRQ свободны. Как это можно сделать? File: IRQ_FAQ.DOC WrittenBy: Alexey Kulentsov, 2:5020/216.6@fidonet Version: 1.01 from 16/11/95 23:52 Что такое IRQ и как с ними бороться Q: Что такое IRQ и зачем зто нужно? A: IRQ расшифровывается как Interrupt Request, или запрос на аппаратное прерывание. Прерывание - это процесс, когда процессор прекращает нормальное выполнение программы, сохраняет необходимую информацию в стеке и переходит к какому-то заранее выбранному адресу памяти. Вызывается прерывание аппаратным сигналом с какого-либо устройства. Есть еще так называемые программные прерывания, но их мы тут рассматривать не будем. Прерывания имеют номера, и по каждому из них переходит переход на свой адрес. После отработки вызванной процедуры, которая называется обработчиком прерывания, управление возвращается в исходную точку, и продолжается выполнение первоначальной программы. Адреса могут выбираться различными способами. апример, быть фиксированными, или находиться в таблице в каком-то месте памяти. Последний случай и имеет место на процессорах семейства 80x86. Дальше будем рассматривать только это семейство и IBM-совместимые машины на его основе. Для поддержки IRQ в схеме компьютера необходима дополнительная микросхема, так называемый контроллер прерываний. В данном случае используется 8259 или его аналоги. В современных машинах это просто часть чипсета. Аппаратные прерывания нужны, чтобы при обслуживании процессором внешних устройств, требующих управления или обмена информацией, избежать циклов их опроса, на что потребуется много процессорного времени и программная поддержка этих циклов во всех программах, работающих на компьютере. При применении IRQ же программа может не заботиться об этом- обработка устройств происходит в фоне для нее. Кроме того, это позволяет оперативно реагировать на устройства, которым нужна быстрая обработка, чтобы не потерять данные. Правда, тут есть свои недостатки. апример, программа может запретить на некоторое время аппаратные прерывания. Кроме того, для начала обработки прерывания должна закончиться предыдущая команда, должны быть сохранены регистры и т.д., то есть задержка может быть довольно значительна. Для более оперативного реагирования иногда применяют механизм DMA (Direct Memory Access). Там процессор не участвует в пересылке данных, и для этого используется еще одна дополнительная микросхема, контроллер DMA. о это уже совсем другой разговор. Q: Что умеет микросхема 8259? A: 8259 может обслуживать восемь запросов на прерывание от внешних устройств, соответственно для этого имеется восемь входов, называются они IRQ0-IRQ7. При поступлении единичного сигнала на один из входов он запоминается во входном регистре запросов прерывания и дальше обрабатывается логикой микросхемы. При каскадном соединении нескольких микросхем возможно обслуживание до 64 линий IRQ. Такое соединение называется каскадным, так как есть один ведущий контроллер и до восьми ведомых, подключаемых ко входам IRQ ведущего. Прерывания имеют уровни приоритетов, приоритеты задаются и меняются программным путем. Программным путем также можно запрещать или разрешать отдельные IRQ, а также выдавать сигнал конца прерывания, что разрешает выдачу запомненных в регистре запросов прерывания сигналов с более низким приоритетом, полученных во время обработки более приоритетного запроса. Q: Как это аппаратно выглядит в IBM-совместимых машинах? A: Часть IRQ в машине зарезервированы для стандартных устройств на материнской плате, а часть может использоваться внешними устройствами и поэтому выведены на стандартный слот ISA. В машинах класса XT один контроллер и есть 8 прерываний, из них шесть выведены на шину: IRQ2-IRQ7. В AT к первому контроллеру дополнительно подключен еще один, и в результате имеется 15 прерываний, так как одно (IRQ2 первого контроллера) используется для каскадирования. а шине дополнительно появились сигналы IRQ10-IRQ12, IRQ14, IRQ15. В схеме XT сигналы IRQ на шине в самом простом случае подключены прямо к входам контроллера и не зашунтированы резисторами. В других конструкциях на логике ставятся буферные повторители. Соответственно пассивный сигнал на шине, как и на микросхеме - нулевой, а поступление запроса на прерывание происходит по единичному фронту. Q: Для чего конкретно используются IRQ в компьютере? A: Вот небольшая таблица, в которой указаны стандартные применения IRQ. Первый контроллер: 8259-1. Стандартное место для его векторов-с адреса 20h, или с 8-го вектора в таблице прерываний. Следует заметить, что это неудачное место, так как начиная с 286 процессора список зарезервированных фирмой Intel прерываний увеличился, и аппаратные прерывания стали пересекаться с ними. Поэтому современные многозадачные операционные системы могут переносить вектора IRQ в другое место. IRQ Int Применение Дополнительные комментарии и применения --- --- ---------- -------------------------------------------- 0 8h Timer Системный таймер, 18.2 раза в секунду 1 9h Keyboard Генерится при нажатии/отпускании кнопок 2 Ah LPT2/Casc. COMx, Vert.Retrace (EGA, VGA) 3 Bh UART 2 COM2, COM4 4 Ch UART 1 COM1, COM3 5 Dh Fixed disk LPT2(AT), COMx 6 Eh Diskette Генерится FDD-контр. по окончании операции 7 Fh Printer LPT1,SoundBlaster Второй контроллер: 8259-2. Появился начиная с AT. Стандартное место для его векторов- 1C0h, или с 70h вектора. IRQ Int Применение Дополнительные комментарии и применения --- --- ---------- -------------------------------------------- 8 70h RTC CMOS Real Time Clock 9 71h IRQ2 Emul. Эмуляция IRQ2 для совместимости 10 72h Free SoundBlaster, часто другие устройства 11 73h Free Общепринятого применения не имеет 12 74h Free Общепринятого применения не имеет 13 75h Math Прерывание сопроцессора 14 76h Hard disk Генерится HDD-контр. по окончании операции 15 77h Free Общепринятого применения не имеет Q: ичего не понял насчет IRQ2/IRQ9 :-( A: История такова. В PC/XT был только один контроллер прерываний, и все прерывания можно было использовать для каких-либо целей. В AT необходимо было увеличить количество прерываний, а поскольку 8259 соединяются каскадно, это означало, что один из входов IRQ 8259-1 необходимо было использовать для подключения второго контроллера. Был выбран IRQ2. При этом пришлось решать проблему совместимости. Дело в том, что IRQ2 был выведен на слоты и мог использоваться различными устройствами. Получается следующая задача: имеется устройство, которое втыкалось в PC и вырабатывало IRQ2, и софт к нему, который садился на соответствующее прерывание о обрабатывал его. еобходимо сделать так, чтобы его можно было воткнуть в AT и чтобы оно и софт продолжали работать. Решена была проблема следующим образом: во-первых, на слот на контакт B4 вместо IRQ2 теперь выводится IRQ9 от 8259-2. Во-вторых, биосовский обработчик IRQ9 эмулирует IRQ2, то есть вызывает соответствующий ему вектор Int 0Ah. Так что теперь для старого устройства процесс выглядит следующим образом: Устройство генерит IRQ2, которое на самом деле IRQ9, вызывается обработчик IRQ9 и программно вызывает обработчик IRQ2 софта к этому устройству, висящий на Int 0Ah. Софт думает, что так и надо, и ничего не замечает. При конструировании же своих устройств можно вешать софт сразу на IRQ9. Естественно, если нужно оставить возможность воткнуть устройство и в XT, то надо сделать номер IRQ изменяемым. Q: Зачем нужно прерывание от EGA/VGA и где используется? A: Это прерывание вызывается в конце прорисовки каждого кадра, позволяя программе выполнять какие-то действия во время обратного хода луча. Это нужно некоторым графическим приложениям, чтобы избежать побочных визуальных эффектов при смене страницы или палитры. о так как это прерывание может быть запрещено на плате джампером, причем адаптеры продаются как раз с запрещенным прерыванием, это прерывание в настоящее время практически не используется, так как никто не будет заставлять пользователя для работы программы открывать машину и перетыкать джамперы. Чтобы отслеживать конец кадра, программы используют циклы опроса через порты. Q: Что такое конфликты IRQ и как их избежать? A: Конфликт IRQ- это когда несколько устройств со своими обработчиками пытаются использовать один IRQ, не умея при этом разделять его аппаратно или программно (большинство современного программного обеспечения как раз не умеет). Для разрешения конфликта необходимо определить, какие именно устройства пересекаются, и перенести одно из них на свободный IRQ. Приведем несколько рекомендаций по этому поводу. Чаще всего встречаются конфликты по IRQ COM-портов. Это связано как с их распространенностью, так и c тем, что COM2 и COM4 используют по умолчанию IRQ3, а COM1 и COM3 - IRQ4. Вот конкретный пример. Q: а машине стоит стандартная мультикарточка, на COM1 находится мышка. адо поставить модем. Как его настроить? A: Во-первых, необходимо поставить его на COM3 или COM4, чтобы он не пересекался с мультикартой в пространстве портов. Во-вторых, из них необходимо выбрать тот порт, IRQ которого по умолчанию не совпадает с используемым мышкой. В данном случае это COM4 (IRQ3). Если мышка на втором порту, то для модема надо использовать COM3 (IRQ4). а самом деле адрес порта и IRQ в модемах обычно выставляются независимо, но данный совет преследует целью избежать нестандартных настроек, что упростит конфигурирование программного обеспечения. То же относится ко всем последующим случаям. Стандартные назначения для COM-портов: Порт COM1 COM2 COM3 COM4 Базовый адрес 3F8 2F8 3E8 2E8 IRQ 4 3 4 3 Впрочем, лучше не будем описывать каждый случай словесно, а изобразим таблицу рекомендуемых конфигураций: IRQ2 IRQ3 IRQ4 IRQ5 IRQ7 IRQ10 Модем3 Модем(COM4) Мышь (COM1) Модем2(COM3) SB Модем3 Мышь (COM2) Modem(COM3) Modem2(COM4) SB Модем3 Модем(COM4) Мышь (COM1) Модем2(COM3) Printer SB Модем3 Мышь (COM2) Modem(COM3) Modem2(COM4) Printer SB Были использованы следующие соображения: во возможности стандартные назначения, по возможности обходиться IRQ3-IRQ7. Два последних случая- когда используется прерывание от принтера. аименьшими возможностями по конфигурированию обладает мышка, от нее соответственно выбирается вариант. Берете список того, что надо поставить, и идете с начала таблицы, проверяя, подходит ли каждай вариант, если выбросить из него лишнее оборудование. Прошу соображения насчет того, как должна выглядеть эта таблица и должна ли вообще, отписать мне (адрес в конце файла). Размер таблицы всего в четыре строки явился результатом моей слабой фантазии, не способной придумать достаточное количество проблем с конфигурированием. Q: Как правильно сделать устройство в слот, использующее IRQ? Можно ли использовать несколько устройств на одном IRQ? A: Можно. Рассмотрим устройство выхода IRQ на плате. Во-первых, в пассивном состоянии он должен быть в Z-состоянии. Значит, нужен элемент с трехстабильным выводом. Это нужно, чтобы можно было подключать несколько плат к одному IRQ. Кроме того, поскольку в машине это обычно не предусмотрено, надо зашунтировать выход на землю резистором килоом на десять, чтобы обеспечить нулевой уровень в пассивном состоянии. При выдаче IRQ выход должен переходить в единичное состояние. Таким образом, для корректной работы нужен элемент типа 555ЛП8 и резистор- не очень сложно. Теперь о программном обеспечении. Для функционирования нескольких независимых обработчиков они должны выполнять следующие действия: Во-первых, сразу же размаскировывать IRQ, а для предотвращения повторного входа при нереентрантном коде использовать собственные флажки. Во-вторых, исходить из того, что неизвестно, свое ли устройство требует обработки, и проверять это. Отсюда сразу следует вывод, что устройство должно иметь какие-то порты, по которым это можно идентифицировать. В-третьих, всегда передавать управление по цепочке следующему обработчику. Это надо делать и в случае активности своего устройства, чтобы при совпадении сигналов IRQ от нескольких устройсв, что означает их потерю, остальные не остались без обработки. И перестает быть критичным время, которое устройство держит активным сигнал IRQ. Q: Я сделал устройство, передающее/принимающее данные и генерящее при этом IRQ, и софт к нему, работающий в фоновом режиме. Однако скорость передачи очень низка, и компьютер сильно тормозится при этом. Что делать? A: Вызов прерывания - это довольно длительный процесс, поэтому надо минимизировать их количество на единицу информации. То есть надо передавать информацию блоками в синхронном режиме, а прерывание должно генериться только одно, при поступлении блока. Если работа с блоками невозможна, применяют FIFO, например, в COM-портах. Это буфер типа очередь, накапливающий информацию и выдающий прерывание по достижении определенной степени наполненности, после чего можно считать ее всю сразу. То же самое при передаче- буфер заполняется и начинает сам передавать данные дальше, а по окончании передачи вызывает прерывание. Реализуется FIFO, как правило, на отдельных микросхемах, имеющих в названии цифры 16550. Послесловие: Пишите мне, если Вы заметили ошибки/неточности, или считаете, что сюда надо добавить еще какую-нибудь информацию. Alexey Kulentsov, 2:5020/216.6 aka 2:5020/401.7 end of file