File: IRQ_FAQ.DOC
WrittenBy: Alexey Kulentsov, 2:5020/449.14@fidonet
Version: 1.03 from 06/02/96 20:50
ThanksTo: Andrew Suvorow, 2:5020/168.101
Igor Sysoev, 2:5020/1.486
Що таке 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 Primary IDE Генерується HDD-контр. після закінчення операції
15 77h Second IDE <<
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 СОМ-портів. Це пов'язано як з
їх поширеністю, так і з тим, що COM2 і COM4 використовують за
умовчанням IRQ3, а COM1 і COM3 - IRQ4. Ось конкретний приклад.
Q: На машині стоїть стандартна мультикарточка, на COM1 знаходиться мишка.
Треба поставити модем. Як його настроїти?
A: По-перше, необхідно поставити його на COM3 або COM4, щоб він не
перетинався з мультикартою в просторі портів. По-друге, з них
необхідно вибрати той порт, IRQ якого за умовчанням не співпадає
з тим, що використовується мишкою. В цьому випадку це COM4 (IRQ3). Якщо
мишка на другому порту, то для модему треба використовувати COM3 (IRQ4).
Насправді адреса порту і IRQ в модемах звичайно виставляються
незалежно, але ця порада переслідує ціль уникнути нестандартних
настройок, що спростить конфігурування програмного забезпечення.
Те ж стосується всіх подальших випадків.
Стандартні призначення для СОМА-портів:
Порт COM1 COM2 COM3 COM4
Базова адреса 3F8 2F8 3E8 2E8
IRQ 4 3 4 3
Проте, краще не будемо описувати кожний випадок словесно, а зобразимо
таблицю рекомендованих конфігурацій, наприклад, для миші, модемів, SB
і принтера:
IRQ2 IRQ3 IRQ4 IRQ5 IRQ7 IRQ10
Модем2(COM3) Модем(COM4) Миша (COM1) SB
Модем2(COM4) Миша (COM2) Modem(COM3) SB
Модем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. Два останніх
випадки- коли використовується переривання від принтера. Найменшими
можливостями по конфігуруванню володіє мишка, від неї
відповідно вибирається варіант. Берете список того, що треба
поставити, і йдете з початку таблиці, перевіряючи, чи підходить каждай
варіант, якщо викинути з нього зайве обладнання. Прошу
міркування щодо того, як повинна виглядати ця таблиця і чи повинна
взагалі, відписати мені (адреса в кінці файла). Ось ще один варіант:
>- - - - - -8<- - - - - - - - - - - - - - - - - thanks to Igor Sysoef
г==========T==T==T===T==T==T==T==T==T==T==T==T==T==T==T==¬
¦Dev \ IRQ ¦ 0¦ 1¦2/9¦ 3¦ 4¦ 5¦ 6¦ 7¦ 8¦10¦11¦12¦13¦14¦15¦
¦----------+--+--+---+--+--+--+--+--+--+--+--+--+--+--+--¦
¦COM1 ¦ .¦ .¦ * ¦ *¦ !¦ *¦ ?¦ *¦ .¦ *¦ *¦ *¦ .¦ .¦ *¦
¦COM2 ¦ .¦ .¦ * ¦ !¦ *¦ *¦ ?¦ *¦ .¦ *¦ *¦ *¦ .¦ .¦ *¦
¦COM3 ¦ .¦ .¦ + ¦ +¦ !¦ +¦ ?¦ *¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦
¦COM4 ¦ .¦ .¦ + ¦ !¦ +¦ +¦ ?¦ *¦ .¦ *¦ *¦ *¦ .¦ .¦ *¦
¦COMx ¦ .¦ .¦ + ¦ +¦ +¦ +¦ ?¦ *¦ .¦ *¦ *¦ *¦ .¦ .¦ *¦
¦LPT1 ¦ .¦ .¦ . ¦ .¦ .¦ *¦ .¦ !¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦
¦LPT2 ¦ .¦ .¦ . ¦ .¦ .¦ !¦ .¦ *¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦
¦SCSI ¦ .¦ .¦ * ¦ *¦ *¦ *¦ .¦ *¦ .¦ +¦ +¦ +¦ .¦ *¦ +¦
¦Sound Card¦ .¦ .¦ * ¦ *¦ *¦ !¦ .¦ !¦ .¦ +¦ +¦ +¦ .¦ .¦ *¦
¦1st IDE ¦ .¦ .¦ . ¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ !¦ .¦
¦2nd IDE ¦ .¦ .¦ . ¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ !¦
¦PS/2 Mouse¦ .¦ .¦ . ¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ .¦ !¦ .¦ .¦ .¦
¦Мережа ¦ .¦ .¦ * ¦ *¦ *¦ +¦ .¦ *¦ .¦ +¦ +¦ +¦ .¦ .¦ *¦
¦Стpимеp ¦ .¦ .¦ * ¦ *¦ *¦ +¦ $¦ *¦ .¦ *¦ *¦ .¦ .¦ .¦ .¦
L==========¦==¦==¦===¦==¦==¦==¦==¦==¦==¦==¦==¦==¦==¦==¦==-
! - загальноприйнятий варіант (default)
+ - поширений варіант
* - рідкий (для irq 2-7) або варіант, що недавно з'явився (для irq 10-15)
? - паталогічні випадки, наприклад, у мене є стара мультяха де
є два com, яким можна задати irq 2, 3, 4, 5,6,7.
$ - стример на флоповому контролері, також, взагалі-то, паталогія.
>- - - - - - 8<- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Q: Як правильно зробити пристрій в слот, що використовує IRQ? Чи Можна
використовувати декілька пристроїв на одному IRQ?
A: Можна. Розглянемо пристрій виходу IRQ на платі. По-перше, в
пасивному стані він повинен бути в Z-стані. Значить, потрібен
елемент з тристабільним виводом. Це потрібно, щоб можна було
підключати декілька плат до одного IRQ. Крім того, оскільки в
машині це звичайно не передбачено, треба зашунтувати вихід на землю
резистором кілоом на десять, щоб забезпечити нульовий рівень в
пасивному стані. При видачі IRQ вихід повинен переходити в
одиничний стан. Таким чином, для коректної роботи потрібен
елемент типу 555ЛП8 і резистор - не дуже складно. Тепер про програмне
забезпечення. Для функціонування декількох незалежних обробників
вони повинні виконувати наступні дії: По-перше, відразу ж
розмаскувати IRQ, а для запобігання повторному входу при
нереентрантному коді використовувати власні прапорці. По-друге,
виходити з того, що невідомо, чи свій пристрій вимагає
обробки, і перевіряти це. Звідси відразу слідує висновок, що
пристрій повинно мати якісь порти, по яких це можна
ідентифікувати. У СОМ-порту є така можливість, у LPT-немає.
По-третє, завжди передавати управління по ланцюжку наступному
обробнику. Це треба робити і в разі активності свого пристрою,
щоб при збігу сигналів IRQ від декількох пристроїв, що
означає їх втрату, інші не залишилися без обробки. І перестає
бути критичным час, який пристрій тримає активним сигнал IRQ.
Крім того, повинні виконуватися загальні рекомендації по організації
резидентів і роботі з ресурсами, що розділяються: при виході або
закінченні роботи з пристроєм кожна програма повинна не забороняти
відповідне переривання, а приводити контролер 8259 в початковий
стан. А забороняти виклик переривання треба на рівні пристрою,
якщо є така можливість. Зняття обробників з переривання повинно
здійснюватися в порядку, зворотному порядку їх завантаження.
Q: Що за нові пункти, що стосуються IRQ, з'явилися в BIOS Setup
материнської плати з PCI шиною?
A: На PCI ідеологія IRQ змінилася, і самі істотні відмінності від
відповідних сигналів на ISA - це, по-перше, завдання номерів
IRQ для конкретних слотів в сетапі, тобто функція вибору номера
IRQ перейшла від картки до материнської плати, а, по-друге,
можливість працювати як по перепаду, так і по рівню, що
дозволяє здійснити більш коректне зашарювання IRQ між
пристроями, в тому числі тими, що не відповідають вищевикладеним
вимогам, що стосуються пристроїв на ISA.
Q: Я зробив пристрій, що передає/приймає дані і генерує при цьому IRQ,
і софт до нього, працюючий в фоновому режимі. Однак швидкість
передачі дуже низька, і комп'ютер сильно гальмується при цьому.
Що робити?
A: Виклик переривання - це досить тривалий процес, тому треба
мінімізувати їх кількість на одиницю інформації. Тобто треба
передавати інформацію блоками в синхронному режимі, а переривання
повинне генеруватися тільки одне, при надходженні блоку. Якщо робота з
блоками неможлива, застосовують FIFO, наприклад, в СОМ-портах. Це буфер
типу черга, що накопичує інформацію і видає переривання по
досягненні певної міри виповненості, після чого можна
зчитати її всю відразу. Те ж саме при передачі - буфер заповнюється і
починає сам передавати дані далі, а після закінчення передачі
викликає переривання. Реалізовується FIFO, як правило, на окремих
мікросхемах, що мають в назві цифри 16550.
Післямова:
Пишіть мені, якщо Ви помітили помилки/неточність, або вважаєте, що
сюди треба додати ще яку-небудь інформацію.
Alexey Kulentsov,
2:5020/216.6 aka 2:5020/401.7 aka 2:5020/449.14
end of file
=============================================================
Переклад - Olexandr Slobodyan, 24.XI.2001
|