Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод упоряд-ПОСЛЕДНЯЯ-МП.doc
Скачиваний:
34
Добавлен:
20.02.2016
Размер:
5 Mб
Скачать

4. Організація переривань

Загальні відомості про систему переривань. Мікропроцесор ВМ86 має ефективну систему переривань, у якій кожному перериванню поставлений у відповідність куркульок (від 0 до 255), що ідентифікує тип переривання. Переривання можуть ініціюватися зовнішніми пристроями (зовнішні переривання) або командами програмних переривань, а в деяких ситуаціях – автоматично самим МП (внутрішні переривання). Можливі джерела переривань показані на мал. 1.7.

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

Для цього в стеці запам'ятовується адреса повернення (CS і IP) і вміст регістра прапорів F, а також уміст тих регістрів, які будуть потрібні для виконання підпрограми обробки переривання. Уміст регістрів CS, IP і F запам'ятовується й відновлюється автоматично, а для запам'ятовування й наступного відновлення вмісту Інших регістрів МП повинні бути передбачені відповідні команди на початку й кінці підпрограми обробки переривань. Слід зазначити, що в стек включається скоректований уміст покажчика команд IP, що відповідає адресі команди, перед якою МП почав обслуговувати переривання. Необхідність корекції викликана тим, що IP адресує команди з випередженням через існування внутрішньої черги команд.

Зовнішні переривання. Запити на зовнішні переривання надходять у МП по двох входах: INTR і NMI, і самі переривання діляться відповідно на маскуєме й немаскуєме. Запити на маскування переривання від ВУ звичайно надходять на входи програмувального контролера переривань (ПКП) К1810ВН59А, що формує сигнал, що подається на вхід, INTR. Відзначимо, що цей ПКП може використовуватися як із МП ВМ86, так і із ВМ80, причому його робота істотно залежить від типу МП. При роботі із ВМ80 контролер у відповідь на перший сигнал підтвердження переривання INTA1 виставляє на шину даних куркульок команди CALL. У МП цей код ініціює ще два сигналу: INTA2 і INTA3, по яких ПКП видає два байти адреси підпрограми. При роботі із ВМ86 у відповідь на сигнал INTA1 ПКП не видає даних у мікропроцесор і буфер даних ПКП залишається у високоомном стані. По сигналу INTA2 ПКП посилає в мікропроцесор байт, що визначає тип (вектор) переривання.

Коли встановлюється сигнал INTR = 1, дії МП залежать від стану прапора IF дозволу переривань. Однак до завершення поточної команди МП, як правило, не вживає ніяких дій.

Є кілька випадків, коли сигнал INTR розпізнається тільки при завершенні наступної команди. Префікси повторення, блокування шини й заміни сегмента вважаються частиною команди, тому переривання між префіксом і командою не сприймається. Команди пересилання в сегментний регістр MOV sr, src і добування зі стека в сегментний регістр POP sr розглядаються аналогічно: переривання не розпізнається до завершення наступної за ними команди. Це необхідно для правильної зміни сегмента, коли здійснюється перезавантаження сегментного регістра й регістра, що визначає зсув у сегменті (наприклад, регістрів SS і SP).

Є два особливих випадки, коли запит переривання розпізнається під час виконання команди, що ставляться до ланцюгової команди з повторенням і до команди WAIT, які можуть виконуватися протягом значного часу. У цих випадках переривання сприймаються після будь-якої закінченої ланцюгової операції (тобто після чергової операції з елементом ланцюжка) або після циклу перевірки сигналу на вході TEST (кожний цикл перевірки забирає час 5Т).

Якщо IF = 0, тобто переривання по входу INTR заборонені (замасковані), МП ігнорує запит переривання й переходить до наступної команди. Мікропроцесор не запам'ятовує стан сигналу INTR, тому цей сигнал повинен залишатися активним, поки що перериває ВУ не одержить сигналу підтвердження INTA або саме не зніме запит. Якщо IF=1, то МП розпізнає запит переривання й обробляє його. Станом прапора IF програміст може управляти за Допомогою команд STI (установка) і CLI (скидання). Ці команди еквівалентні командам EI (дозвіл переривання) і DI (заборона переривання) МП ВМ80. Крім того, ПКП може здійснювати селективне маскування запитів переривання від окремих пристроїв, якщо в контролер посланий відповідний наказ.

Мікропроцесор ВМ86 підтверджує запит переривання, виконуючи два послідовних циклу INTA. Якщо в цих циклах з'являється запит шини по лінії HOLD (у мінімальному режимі) або RQ – GT (у максимальному режимі), то він не сприймається до завершення обох циклів INTA. У максимальному режимі МП генерує в цих циклах сигнал блокування шини LOCK, щоб інші процесори не намагалися запитувати шину.

Запити на немаскуєме переривання надходять по входу NMI і звичайно використовуються для переривання роботи МП при «катастрофічних» подіях, що вимагають негайної реакції, таких, як аварійне провалля живлення, виявлення помилки пам'яті й т.д. Вхід NMI сприймає перехід сигналу від низького рівня до високого (позитивний фронт), щоб поточна програма не переривалася від одного сигналу NMI = 1 кілька разів. Запити NMI запам'ятовуються в МП і мають більше високий пріоритет, чим переривання по входу INTR. Обробка немаскуємого переривання не залежить від стану прапора IF. Немаскуємому перериванню привласнюється фіксований код типу 2, що автоматично формується усередині МП. Тому у відповідь на NMI цикли шини підтвердження переривання INTA не формуються, що прискорює реакцію МП на запити немаскуємих переривань.

Зовнішнє переривання може з'явитися в довільний момент часу, тобто асинхронно стосовно дій МП. Час реакції МП, що визначає запізнювання обслуговування переривання, залежить від часу завершення поточної команди. Найбільше запізнювання може відбутися при виконанні команд множення, розподілу й параметричного зрушення на багато бітів. Основні параметри різних видів переривань дані в табл. 1.15, де переривання перераховані в порядку убування їхніх пріоритетів.

Таблиця 1.15

Вид переривання

Тип переривання

Пріоритет

Час виклику підпрограми переривання

За помилкою ділення

0

1

50

За командою INT n

5-30

1

51

За командою INT0

4

1

53

За командою INT3

3

1

52

За входом NMI

2

2

50

За входом INTR

32-255

3

61

За флагом TF

1

4

50

При аналізі пріоритетів необхідно враховувати маскуємість зовнішніх переривань по входу INTR.-що може привести до перерозподілу пріоритетів. Якщо, наприклад, одночасно виникають немаскуєме й маскуєме переривання, МП починає виконання немаскуємого переривання вищий пріоритет, що як має, і маскує зовнішні переривання скиданням прапора IF. В атом випадку запит по входу INTR приймається лише по закінченні обслуговування немаскуємого переривання. Однак обслуговування запиту маскуємого переривання може бути дозволене при виконанні підпрограми обслуговування будь-якого переривання шляхом установки прапора IF.

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

Переривання помилково розподілу (тип 0) генерується мікропроцесором відразу після виконання команд розподілу DIV і IDIV, якщо формат частки перевищує формат одержувача або у випадку розподілу на нуль. Час реакції МП на переривання типу 0 і виконання відповідної підпрограми варто враховувати при оцінці тривалості команди розподілу в найгіршому випадку.

Переривання по переповненню (тип 4) генерується по однобайтовой команді INTO, якщо встановлено прапор OF.

Покрокове переривання (тип 1) виробляється автоматично при TF = = 1 після виконання кожної команди або пари команд, якщо перша команда змінює вміст сегментного регістра. Звичайно це переривання використовується в програмах налагодження для реалізації покомандного виконання програми. При обробці переривання МП включає в стек регістри F, CS і IP, а потім скидає прапори IF і TF. Тому після виклику підпрограми МП працює звичайним образом, а не в покроковому режимі. Підпрограма обробки покрокового переривання звичайно здійснює індикацію внутрішніх регістрів МП і вмісту деяких комірок пам'яті. Коли підпрограма завершується, зі стека витягають колишні стани прапорів і МП знову переводиться в покроковий режим роботи.

Як ми вже відзначали, МП ВМ86 не має команд установки й скидання прапора TF. Відсутні також команди, які дозволили б організувати пересилання між старшим байтом регістра F і загальним регістром МП. Стан прапора TF можна змінювати, впливаючи на нього після включення регістра F у стек. Для включення регістра F у стек і добування його зі стека передбачені відповідно команди PUSHF і POPF. Значення TF=1 установлюється шляхом об'єднання по АБО вмісту регістра з константою 0100, a TF = 0 -шляхом об'єднання по И с константою FEFF. Якщо встановлено ТТ=1, то перше покрокове переривання відбудеться після виконання команди, що випливає за командою повернення з підпрограми обробки покрокового переривання.

У покроковому режимі МП реагує на зовнішні й внутрішні переривання. Звичайним шляхом (із включенням у стек регістрів CS, IP і F) здійснюється перехід на підпрограму обробки виниклого переривання. Однак до виконання першої команди цієї підпрограми розпізнається покрокове переривання й керування передається підпрограмі обробки покрокового переривання типу 1, після завершення якої МП вертається до виконання підпрограми прийнятого раніше переривання.

Переривання, обумовлене користувачем при складанні програми, здійснюється по двухбайтовій команді INTn, у якій тип переривання вказується в другому байті команди. Команда INTn викликає необхідну підпрограму, як і команда CALL, однак при переході на підпрограму команда INTn здійснює запам'ятовування не тільки адреси повернення (CS і IP), але й регістра прапорів F. При цьому виконується між сегментний перехід, причому адреса підпрограми розташовується не у форматі команди або в довільній комірці пам'яті, а в спеціально сформованій таблиці.

Процедури програмних переривань зручно застосовувати в системах, де допускається динамічне переміщення програм (процедур) при їхньому виконанні. Оскільки таблиця покажчиків перебуває у фіксованій області пам'яті, процедури можуть викликати один одного через цю таблицю. Цим забезпечується стійка взаємодія, що не залежить від адрес процедур, якщо переміщення процедури в пам'яті супроводжується відповідною модифікацією таблиці покажчиків.

Однобайтова команда INT3 викликає переривання типу 3, що визначене як переривання контрольної крапки (крапки розриву). Контрольною крапкою може бути будь-яке місце в програмі, де нормальне її виконання переривається й виробляються деякі спеціальні дії. Контрольні крапки звичайно вводяться при налагодженні як засіб індикації вмісту регістрів, комірок пам'яті й портів уведення в критичних місцях програми. Цю команду можна також використовувати, щоб вставити додатковий фрагмент програми без її повторної трансляції.

Процедура обслуговування переривань. Зв'язок між кодом, що визначає тип переривання, і підпрограмою (процедурою) обслуговування переривання встановлюється за Допомогою таблиці покажчиків векторів переривань (мал. 1.8). Повна таблиця займає 1 Кбайт пам'яті й містить 256 елементів, розташованих по адресах 0-3FF. Кожний елемент n таблиці містить два слова, що визначають початкову логічну адресу підпрограми. Слово з більшою адресою містить базова адреса сегмента, а слово з меншою адресою – зсув підпрограми від початку кодового сегмента. При переході на підпрограму зсув завантажується в регістр IP, а адреса сегмента завантажується в регістр CS. Тому що розмір кожного елемента таблиці становить 4 Байт, МП обчислює адреса (зсув) необхідного елемента шляхом множення типу переривання на 4.

Необхідно відзначити, що при звертанні до таблиці покажчиків сегментні регістри не використовуються. При формуванні фізичної адреси обчислений зсув складається з нулем і жоден сегментним регістром не використовується, на що вказують сигнали стану S4 = S5 = 10. Після встановлення нового вмісту регістрів IP і CS мікропроцесор вибирає код операції першої команди підпрограми й потім виконує звичайні дії по заповненню черги команд, виконанню команд і обміну даними.

Коли здійснюється перехід на підпрограму обслуговування переривання, уміст регістра F (разом із умістом регістрів CS і IP) запам'ятовується в стеці, прапор IF (а також прапор TF) скидається. Тим самим автоматично забороняються зовнішні переривання по входу INT, що потрібно, наприклад, для захисту початкової ділянки підпрограми, протягом якого здійснюється включення в стек внутрішніх регістрів МП. Потім

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

Наприкінці підпрограми відновлюють уміст регістрів МП, які були включені в стек на початку підпрограми з метою збереження даних, що ставляться до перерваної програми. Ця ділянка підпрограми варто захистити за допомогою команди CLI від переривань по входу INTR. Підпрограма обробки переривання повинна закінчуватися командою повернення з переривання IRET, що передує команда дозволу переривань STI. Перед виконанням команди IRET стік повинен бути в тім стані, у якому він був відразу після виклику підпрограми. Тоді ця команда витягає три верхні слова зі стека в регістри IP, CS і F, що забезпечує повернення до команди, що виконувалася б у випадку відсутності переривання.