система переривань

Переривання - призупинення роботи однієї програми і передача управління іншій при виникненні деякого незалежного від них події. При цьому зберігається можливість повернення управління перерваної програми, без втрати нею работоспосодності.

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

Робота з векторами переривань;

ПРИМІТКА: Ще раз підкреслюється, що мова йде перш за все про реальному режимі. Спроба "спробувати" в будь-якому іншому може мати непередбачувані наслідки.

Таблиця дескрипторів переривань захищеного режиму доступна тільки з нульового кільця захисту, ви можете створити або змінити її якщо виконаєте перемикання в захищені режим самостійно!

При роботі в режимі V86 можлива зміна способу таблиці переривань, але наслідки визначаються можливостями віртуального монітора!

Робота з векторами переривань.

Необхідність працювати з таблицею переривань може виникнути в наступних випадках:

Як переривання можна викликати одну з ваших підпрограм. Хоча виклик підпрограми як переривання вимагає більше процесорного часу, такий підхід виправданий якщо необхідно порушити принцип ієрархічності програмного забезпечення всередині одного модуля або якщо ця процедура використовується багатьма Вашими програмами (її можна залишити резидентної після завершення програми настройки Вашої системи).

Другою причиною написання переривання може бути використання будь-якого окремого апаратного переривання. Це переривання автоматично викликається при виникненні певних умов.
Зазвичай BIOS ініціалізує невикористані нею вектора переривань так, що вони вказують на процедуру, яка взагалі нічого не робить (вона містить один оператор IRET). Ви можете написати свою процедуру і змінити вектор переривань, щоб він вказував на неї. Тоді при виникненні апаратного переривання буде виконуватися Ваша процедура.

Можлива заміна існуючого переривання на ваше власне. Одне з таких переривань це переривання часу доби, яке автоматично викликається 18.2 рази в секунду. Зазвичай це переривання тільки оновлює показання годин, але Ви можете використовувати його для синхронізації подій всередині Вашої програми. Інші можливості - це написання процедури обробки Ctrl-Break якщо Ваша програма повинна виконувати якісь специфічні дії перед своїм завершенням.

Нарешті, Ви можете захотіти написати переривання, яке доповнить одну з процедур операційної системи. У цьому випадку після виконання необхідних Вам дій необхідно передати управління вихідної подпрограмме обслуговування прераваній (використовується "довгий" безумовний перехід або додаткове переривання). Такий прийом може знадобитися при написанні резидентних програм, які отримують управління при отриманні певної команди з клавіатури.

Таблиця векторів переривань займає 1Кбайт пам'яті в діапазоні 00000h - 00400h. Кожному вектору відводиться чотири байти в таблиці і присвоюється номер від 00h до FFh. При ініціалізації системи вектора налаштовуються на підпрограми, розташовані в ROM BIOS або DOS.

PUSH DS; зберігаємо DS

MOV DX, OFFSET ROUT; зміщення для процедури в DX

MOV AX, SEG ROUT; сегмент процедури

MOV DS, AX; поміщаємо в DS

MOV AH, 25H; функція установки вектора

MOV AL, 60H; номер вектора

INT 21H; міняємо переривання

POP DS; відновлюємо DS

Контролер НЖМД в AT, XT286, PS50 +

Мікросхема 8259 має три однобайтовим регістра, які керують вісьмома лініями апаратних переривань. Регістр запиту на переривання (IRR) встановлює відповідний біт, коли лінія переривання сигналізує про запит. Потім мікросхема автоматично перевіряє не обробляється чи інше переривання. При цьому вона запитує інформацію регістра обслуговування (ISR). Додаткова ланцюг відповідає за схему пріоритетів. Нарешті, перед викликом переривання, перевіряється регістр маски переривань (IMR), щоб дізнатися чи дозволено в даний момент переривання даного рівня.

Перед роботою контролер повинен бути ініціалізованим першим. Ініціалізація здійснюється завантаженням керуючих слів (до 4-х байт). Після ініціалізації контролер переходить в операційний режим.

Коли розроблявся контролер переривань для i8085 в його схемі були допущені помилки, тому при розробці контролера для i8086 (мікросхема 8259A) передбачили можливість його роботи і в системах, побудованих на базі i8085. Налаштування буде розглядатися тільки для систем i8086.

Порт 20h - керуюче слово ініціалізації ICW1:

біт 0 1 чотири слова ініціалізації (слово ICW4 визначає особливості взаємин ведучого і веденого контролерів);

біт 1 + 1 в системі використовується один контролер;

біт 2 0 вектор 8-ми байтовий,

1 вектор 4-х байтовий;

біт 3 0 фіксація переривання "на фронті" (в PC і AT),

1 фіксація переривання "на рівні" (в PS / 2);

біт 4 дорівнює 1 - ознака ICW1;

біти 7..5 дорівнюють нулю (для i8086).

Порт 21h - керуюче слово ініціалізації ICW2:

біти 2..0 дорівнюють нулю (для i8086);

біти 7..3 старша частина номера вектора переривання (для i8086).

Порт 21h - керуюче слово ініціалізації ICW3 для ведучого:

біти 7..0 1 позначаються лінії до яких підключені ведені контролери;

Порт 21h - керуюче слово ініціалізації ICW3 для веденого:

біти 2..0 номер лінії головного контролера до якої під'єднаний контролер,

біти 7..3 дорівнюють нулю;

Порт 21h - керуюче слово ініціалізації ICW4

біт 0 1 (для i8086);

біт 1 0 завершення переривання по команді,

1 автоматичне визначення кінця переривання;

біти 3..2 режим буферизації:

0 або 1 буферизация не використовується,

2 підлеглий режим буферизації,

3 ведучий режим буферизації;

біт 4 0 послідовно,

1 спеціальний повний вкладений режим.

біти 7..5 дорівнюють нулю.

ПРИМІТКА: Керуючі слова ініціалізації завантажуються последовалельно після передачі ICW1.

Управління операціями контролера.

Команди управління операціями можуть бути послані контролеру після ініціалізації в будь-який момент.

Порт 21h - OCW1 регістр маски переривань (IMR)

біти 7..0 0 обслуговування переривання,

1 маскування переривання;

Порт 20h - OCW2 регістр команд переривань (ICR)

біти 2..0 визначають номер біта регістра поточного обслуговування (ISR),

біти 4..3 дорівнюють нулю (визначають OCW2),

біт 5 1 завершення переривання;

біт 6 1 очищення зазначеного біта ISR;

битий 7 1 циклічний зсув пріоритетів.

Порт 20h - OCW3 слово управління операцією

біти 1..0 читання регістра:

0 або 1 читання немає,

біт 2 1 вказівку сформувати слово-стану (містить номер найвищого запиту з надійшли);

біти 4..3 01 ознака OCW3;

біти 6..5 спеціальне маскування:

0 або 1 відсутня,

3 встановлює (при цьому вирівнюються пріоритети запитів);

біт 7 дорівнює нулю.

Заборона / дозвіл окремих апаратних переривань.

Програми на асемблера можуть заборонити апаратні переривання. Це маскіруемие переривання; інші апаратні переривання, що виникають при деяких помилках (таких як розподіл на нуль) не можуть бути маскувати.

Є дві причини для заборони апаратних переривань.

У першому випадку все переривання блокуються з тим щоб критична частина коду була виконана повністю, перш ніж машина зробить будь-яке інше дію. Наприклад, переривання забороняють при зміні вектора апаратного переривання, уникаючи виконання переривання коли вектор змінений тільки наполовину.

У другому випадку маскуються тільки певні апаратні переривання. Це робиться коли деякі певні переривання можуть взаємодіяти з операціями, критичними до часів. Наприклад, точно розрахована за часом процедура введення / виводу не може собі дозволити бути перерваної тривалим дисковим перериванням.

Виконання переривань залежить від значення прапора переривання (біт 9) в регістрі прапорів. Коли цей біт дорівнює 0, то дозволені всі переривання, які дозволяє маска. Коли він дорівнює 1, то все апаратні переривання заборонені. Щоб заборонити переривання, встановивши цей прапор в 1, використовується інструкція CLI. Для очищення цього прапора і відновлення переривань - інструкція STI. Уникайте відключення переривань на тривалий період. Переривання часу доби відбувається 18.2 рази в секунду і якщо до цього переривання був більш ніж один запит в той час, коли апаратні переривання були заборонені, то зайві запити будуть відкинуті ісістемное час буде визначатися неправильно.

Машина автоматично забороняє апаратні переривання при виклику програмних переривань і автоматично дозволяє їх при поверненні. Коли Ви пишете свої програмні переривання, то Ви можете почати програму з інструкції STI, якщо Ви можете допустити апаратні переривання. Однак якщо за інструкцією CLI не слід STI, то це призведе до зупинки машини, так як введення з клавіатури буде заморожений.

Наведений нижче приклад блокує дисковий переривання. Не забудьте очистити регістр в кінці програми, інакше звернення до дисків буде заборонено і після завершення програми.

; --- маскування 6-го біта регістра маски переривань

MOV AL, 01000000B; маскуючи біт 6

OUT 21H, AL; посилаємо в регістр маски переривань

OUT 21H, AL; очищаємо IMR в кінці програми

В кінці коду кожного з Ваших апаратних переривань Ви повинні включити наступні 2 рядки коду:

Якщо апаратне переривання не закінчується цими рядками, то мікросхема 8259 не очиститься інформацію регістра обслуговування, з тим щоб було дозволено обробка переривань з більш низькими рівнями, ніж тільки що оброблене. Відсутність цих рядків легко може привести до краху програми, так як переривання від клавіатури швидше за все виявляться замороженими і навіть Ctrl-Alt-Del виявиться марним. Ця добавка не потрібна для тих векторів переривань, які є розширеннями існуючих переривань.

Схожі статті