
- •Передмова
- •Intel 430lx
- •Intel 430nx
- •Intel 430fx
- •Intel 430hx
- •Intel 430vx
- •Intel 430tx
- •Intel 450gx/kx
- •Intel 440fx
- •Intel 440lx agPset
- •Intel 440ex
- •Intel 440bx agPset
- •Заняття 1. Поняття про систему переривання пеом
- •Принципи організації системи переривання програм
- •Слово стану процесора (програми)
- •Характеристики системи переривання
- •Організація переходу до перериваючої програми та пріоритетне обслуговування запитів переривання
- •Процедура переривання з опитуванням джерел (прапорців) переривання
- •Програмно-керований пріоритет перериваючих програм
- •Методи використання механізму переривань
- •Класи переривань пеом
- •Призначення контролера апаратних переривань пеом
- •Опис основних елементів і8259а
- •Стани програмованого контролера переривань
- •Заняття 5. Керування режимами роботи пкп
- •Void main (void){
- •Int mask;
- •Заняття 6. Керування пріоритетами переривань
- •Install proc near
- •Заняття 8. Особливості практичного використання апаратних та програмних переривань
- •Volatile long ticks;
- •Void main(void) {
- •Void _interrupt _far timer(void) {
- •Int8 proc near cli
- •Int09 proc near
- •Розділ 3. Підсистема таймера та годинника реального часу
- •Заняття 3. Системні засоби програмного доступу до ресурсів таймера
- •Void tm_delay(int ticks) {
- •Void main (void){
- •Void main(void){
- •Заняття 4. Приклади використання функціональних можливостей таймера в прикладних задачах
- •Void main(void){ int Frac; char k;
- •Void tm_sound(int freq, int time) {
- •Void tm_delay(int ticks) {
- •Void tm_sound(int freq, int time){
- •Void main(){
- •Void main() { int I,j; clrscr();
- •Заняття 5. Архітектура та принципи функціонування годинника реального часу
Заняття 6. Керування пріоритетами переривань
Тема заняття
Способи зміни дисциплін обслуговування переривань.
Керування пріоритетами переривань.
Мета заняття
Усвідомити функціональні можливості ПКП по керуванню пріоритетами переривань.
Отримати уявлення про можливі розподілення пріоритетів при їх ротації.
Засвоїти поняття автоматичної ротації при рівних пріоритетах.
Вивчити спосіб ротації в автоматичному режимі ЕОІ.
Вивчити спосіб спеціальної ротації пріоритетів.
Навчитись формувати команди встановлення пріоритету.
Навчитись виконувати ротацію пріоритетів за спеціальною командою ЕОІ.
Керування пріоритетами переривань
Для керування пріоритетами переривань в І8259А є багато команд і режимів. Всі їх можна запрограмувати, тобто можна змінити динамічно. Ці режими та команди забезпечують для користувача практично необмежені можливості в галузі прикладних програм, керованих за перериваннями.
Отримуючи запити від зовнішніх пристроїв, контролер оцінює, який з них має найвищий рівень пріоритету. При цьому рівні пріоритету входів IRQ7-IRQ0 заздалегідь задані та знаходяться завжди в строго визначеному співвідношенні, яке прийнято називати визначати рівень пріоритету кожного входу IRQ мікросхеми. Контролер має кілька програмних способів задання пріоритетного кільця, що застосовуються залежно від системних вимог.
Усі можливі варіанти статусів наведені в табл. 2.3.
Вхід мікросхеми |
Статус рівня пріоритету |
IRQ0 |
76 543210 |
IRQ1 |
07654321 |
IRQ2 |
10765432 |
IRQ3 |
21076543 |
IRQ4 |
32107654 |
IRQ5 |
43210765 |
IRQ6 |
54321076 |
IRQ7 |
65432107 |
Автоматична ротація, рівні пріоритети
Автоматична ротація пріоритетів використовується в тих випадках, коли перериваючі пристрої (наприклад, канали зв'язку) мають рівні пріоритети. Ідея полягає в тому, що коли який-небудь пристрій уже обслуговується, інші пристрої повинні отримати можливість обслуговування перед наступним обслуговуванням даного пристрою. Для цього обслуженому пристрою автоматично присвоюється нижчий пріоритет. Отже, в гіршому випадку, цьому пристрою доведеться чекати, поки будуть обслужені всі інші пристрої.
Існує два методи реалізації автоматичної ротації: у сполученні зі звичайною ЕОІ (ротація за звичайною командою ЕОІ) та з АЕОІ (ротація в автоматичному режимі ЕОІ).
У базовій конфігурації PC AT автоматична ротація пріоритетів не використовується.
Коли використовується ротація за командою ЕОІ, молодший розряд в ISR скидається, як і при звичайній ЕОІ, а відповідному IRQ присвоюється нижчий пріоритет. Пріоритети інших IRQ зсуваються згідно з режимом повного вкладення (див. рис. 2.10).
На рис. 2.15 наведено, як ротація за звичайною командою ЕОІ впливає на пріоритети перериван
Припустимо, що пріоритети IRQ0-IRQ7 розподілені від вищого пріоритету до нижчого. Обслуговуються переривання по IRQ6 та IRQ4, але жодне ще не завершено. Оскільки IRQ4 має вищий пріоритет, відповідна програма оброблювача обов'язково виконується. Під час виконання програми по IRQ4 здійснюється ротація за звичайною командою ЕОІ. При цьому скидається розряд 4 в ISR. Після цього IRQ4 отримує нижчий пріоритет, а вищий присвоюється IRQ5. У базовій конфігурації PC AT автоматична ротація за звичайною командою ЕОІ не використовується
Ротація в автоматичному режимі ЕОІ
Цей випадок нагадує тільки що розглянену ротацію за звичайною командою ЕОІ. Основна його відмінність полягає в тому, що ротація пріоритетів виконується автоматично після другого імпульсу INTA підтвердження запиту переривання. Для входу в цей режим та виходу з нього передбачені відповідні команди: встановлення та скидання тригера ротації по ЕОІ. Після цього, як і в звичайному автоматичному режимі ЕОІ, ніякі команди не потрібні. Але слід пам'ятати про основні умови використання автоматичного режиму ЕОІ будь-якої форми. Вказівка, наведена для автоматичного режиму ЕОІ, залишається в силі і для ротації в цьому режимі.
У базовій конфігурації PC AT ротація в автоматичному режимі ЕОІ не використовується Спеціальна ротація пріоритетів
Спеціальна ротація надає користувачу широкі можливості обробки з використанням переривань. Вона доцільна в тих випадках, коли необхідно змінювати пріоритети переривань від окремих пристроїв. На відміну від автоматичної ротації спеціальна ротація повністю керується користувачем, тобто користувач сам вибирає розподілення пріоритетів між рівнями переривань. Це можна зробити під час виконання основної програми або сервісних програм. У користувача є дві команди спеціальної ротації: «Встановити пріоритет» та «Ротація за спеціальною командою ЕОІ». У базовій конфігурації PC AT спеціальна ротація пріоритетів не використовується.
Команда встановлення пріоритету
Команда встановлення пріоритету дозволяє програмісту присвоїти певному рівню IRQ нижчий пріоритет (дно пріоритетного кільця). Всі інші рівні отримують пріоритети згідно з режимом повного вкладення з урахуванням присвоєного нижчого пріоритету.
На рис. 2.16 наведено стан ISR та відносні пріоритети рівнів переривання до та після виконання команди встановлення пріоритету.
Виконуються три програми обслуговування переривань. Оскільки IRQ2 має вищий пріоритет, обов'язково виконується відповідна програма оброблювача. Під час виконання цієї програми пріоритети змінюються так, що вищий пріоритет отримує IRQ5. Для цього в І8259А просто відсилається команда встановлення пріоритету. В даному випадку ця команда призначає IRQ4 нижчий пріоритет. Хоча IRQ7 має тепер вищий пріоритет порівняно з IRQ2, він не буде підтверджений до завершення програми по IRQ2 (шляхом ЕОІ). Це пояснюється тим, що пріоритети визначаються тільки після запиту переривання або послідовності підтвердження переривання. Якщо в ході виконання програми по IRQ2 з'явиться запит з більш високим пріоритетом, то пріоритети будуть визначені і вищий пріоритет буде підтверджений. По закінченні виконання програми оброблювача переривань, в якій використовується команда встановлення пріоритету, повинна бути видана належна команда ЕОІ.
Звичайна команда ЕОІ не повинна використовуватись у тій програмі оброблювача, де є команда встановлення пріоритету. Це пояснюється тим, що звичайна команда ЕОІ скидає розряд ISR, що відповідає вищому пріоритету, який при використанні команди встановлення пріоритету не завжди відповідає останній програмі оброблювача. З іншого боку, автоматичний режим ЕОІ можна використовувати за командою встановлення пріоритету. Справа в тому, що в цьому випадку звичайна команда ЕОІ виконується до того, як може бути видана команда встановлення пріоритету. В більшості випадків, коли в сервісній програмі використовується команда встановлення пріоритету, найкраще застосовувати спеціальну команду ЕОІ. При цьому скидання в ISR конкретного розряду завершуваної програми виключає плутанину.
У базовій конфігурації PC AT команда встановлення пріоритету не використовується.
Ротація за спеціальною командою ЕОІ Ротація за спеціальною командою ЕОІ є поєднанням команди встановлення пріоритету та спеціальної команди ЕОІ. Як і при команді встановлення пріоритету,
вказаному рівню IRQ присвоюється нижчий пріоритет. Як і при спеціальній команді ЕОІ, в ISR буде скинуто вказаний рівень. Таким чином, у режимі ротації за спеціальною командою ЕОІ об'єднуються функції двох команд. Цей режим доцільний, коли не треба змінювати пріоритети IRQ до закінчення виконання програми по перериванню.
У базовій конфігурації PC AT ротація за спеціальною командою ЕОІ не використовується.
Практикум Лабораторна робота 2
Тема роботи
Вивчення та дослідження методів програмного задавання режимів роботи контролерів переривань.
Мета роботи
Зрозуміти та засвоїти призначення та способи використання керуючих слів та робочих наказів.
Вивчити потенційні можливості апаратного забезпечення системи переривань.
Навчитись формувати структури керуючих слів та робочих наказів для різних режимів функціонування контролерів переривань.
Засвоїти послідовність дій при ініціалізації ПКП.
Навчитись створювати програмні модулі ініціа лізації ПКП.
Навчитись використовувати функціональні можливості обладнання ПКП у прикладному програмуванні.
Вимоги
Для виконання роботи потрібні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування програмованого контролера переривань, знання форматів керуючих слів ICW та робочих наказів OCW, навички програмного доступу до регістрів ПКП.
На вінчестері комп'ютера має бути встановлене середовище програмування Borland C++ V3.01 в каталозі ВС.
Вправа 1
Дослідіть програму inicial. с, яка є типовою програмою ініціалізації контролерів переривання.
За текстом програми нарисуйте схему алгоритму.
На вінчестері створіть каталог РКР.
За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його в каталог РКР.
Виконайте настройку програми та запустіть її на виконання.
Зробіть висновки про Ваш досвід з дослідження програмного керування режимами ПКП.
Вправа 2
Спробуйте розробити пропозиції по доробці програми та її застосуванні для зміни дисциплін обслуговування переривань та вказання способів їх завершення.
Виконайте пункти 3-6 Вправи 1.
//Типова демонстраційна програма ініціалізації //контролерів переривань inicial. c
#include <stdio.h> #include <conio.h> #include <dos.h> void main(void) {
int icwlm=0xl5,icw2m=0x08,icw3m=0x04, icw4m=
=0x01,mascm=0x00;
int icwls=0xl5,icw2s=0x70,icw3s=0x02,icw4s=
=0x01,mascs=0x00;
int ocwl,ocw2,ocw3, del=2500;
clrscr();
ргіntf("\n\Ініціалізація ведучого контролера (MASTER)"
"\n " );
delay(del);
printf("\n\nЗаписуємо шістнадцятковий код керуючого слова ICW1=15H"
"\nза адресою 20Н."); delay(del);
printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW2=08H"
"\nза адресою 21Н.»); delay(del);
printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW3=04H "
"\nза адресою 21Н."); delay(del);
printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW4=01H"
"\nза адресою 21Н."); delay(del);
ргіntf("\n\nСкидаємо маску в регістрі маскування каналів");
delay(del);
outp(0x20,icwlm); outp(0x21 ,icw2m); outp(0x21 ,icw3m); outp(0x21 ,icw4m); outp(0x21,mascm);
ргіnі£("\nІніціалізація ведучого контролера завершена!!!."
"\n ");
delay(del);
clrscr(); ргіпі^"\n\nІшціалізація веденого контролера (SLAVE)"
"\n ");
printf("\n\n3аписуємо шістнадцятковии код керуючого слова ICW1=15H"
"\nза адресою АОН."); delay(del);
printf("\n\n3аписуємо шістнадцятковии код керуючого слова ICW2=70H"
"\nза адресою А1Н."); delay(del);
printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW3=02H"
"\пза адресою А1Н."); delay(del);
printf("\n\n3писуємо шістнадцятковии код керуючого слова ICW4=01H"
"\nза адресою А1Н."); delay(del);
printf("\n\nСкидаємо маску в регістрі маскування каналів");
outp(0xa0,icwls); outp(0xa 1 ,icw2s); outp(0xa 1 ,icw3s); outp(0xa 1 ,icw4s); outp(0xa 1 ,mascs);
delay(del);
ргintf("\n\Ініціалізація системи переривань завершена"
d
elay(del);
clrscr();
printf("\nTeпep можете ввести робочі накази 0CW для (MASTER)"
"\n ");
delay(del); while (1){
printf("\n\nXoчeтe вводити 0CW1 - ? (Y/N)"); if (getch()=='n') break;
printf("\n\nВедіть шістнадцятковий код робочого наказу 0CW1 - ");
scanf(«%x», &ocwl); outp(0x21,ocwl);
while (1){
printf("\n\nXoчeтe вводити 0CW2 - ? (Y/N)")-if (getch()=='n') break;
printf("\n\nBведіть шістнадцятковий код робочого наказу 0CW2 - ");
scanf("%x", &ocw2); outp(0x20,ocw2);
while (1){
printf( "\n\nХочете вводити 0CW3 - ? (Y/N)"); if (getch()==V) break;
printf("\n\nBведіть шістнадцятковий код робочого наказу OCW3 - ");
scanf("%x", &ocw3); outp(0x20,ocw3);
printf("\n\nTeпep можете ввести робочі накази OCW для (SLAVE)"
"\n ");
while (1){
printf("\n\nXчетe вводити 0CW1 - ? (Y/N)"); if (getch()==V) break;
printf( \n\nВведіть шістнадцятковий код робочого наказу 0CW1 - ");
scanf("%x", &ocwl); outp(Oxal,ocwl);
while (1){
printf("\n\nXoчeтe вводити 0CW2 - ? (Y/N)"); if (getch()==V) break;
ргіпі^"\n\nВведіть шістнадцятковий код робочого наказу 0CW2 - ");
scanf("%x", &ocw2); outp(0xa0,ocw2);
while (1){
printf("\n\nXoчeтe вводити 0CW3 - ? (Y/N)); if (getch()==V) break;
printf("\n\nBведіть шістнадцятковий код робочого наказу 0CW3 - ");
scanf("%x", &ocw3); outp(0xa0,ocw3);
printf("\n\Bвід робочих наказів завершений"
"\n ");
Питання для самоконтролю знань
Що означає поняття ротація пріоритетів?
Що означає поняття задати статус рівнів пріоритету системі переривання?
Наведіть приклади задавання статусу рівням пріоритету у вигляді таблиці.
У яких випадках доцільно використовувати автоматичну ротацію пріоритетів?
Які існують методи автоматичної ротації пріоритетів?
Яка послідовність дій при ротації за звичайною командою ЕОІ? Наведіть приклад.
Яка послідовність дій при ротації в автоматичному режимі ЕОІ? Наведіть приклад.
У яких випадках доцільно використовувати спеціальну ротацію пріоритетів?
9. Які команди використовуються для реалізації спеціальної ротації пріоритетів?
10. Які можливості надає користувачу команда встановлення пріоритету?
11. Які можливості надає користувачу команда «Ротація за спеціальною командою ЕОІ»?
Резюме
Для керування пріоритетами переривань в І8259А є багато команд та режимів. Усі вони програмуються, тобто можуть бути зміненими динамічно. Контролер має кілька програмних способів задавання пріоритетного кільця, що застосовуються залежно від системних вимог.
Наприклад, автоматична ротація пріоритетів використовується у тих випадках, коли перериваючі пристрої (наприклад, канали зв'язку) мають рівні пріоритети. Існує два методи реалізації автоматичної ротації: у сполученні зі звичайною ЕОІ (ротація за звичайною командою ЕОІ) та з АЕОІ (ротація в автоматичному режимі ЕОІ). Крім цього, передбачена можливість реалізації спеціальної ротації, яка надає користувачу широкі можливості обробки даних з використанням переривань. Вона доцільна в тих випадках, коли необхідно змінювати пріоритети переривань від окремих пристроїв.
Для програмної зміни дисциплін обслуговування пріоритетів є спеціальна команда встановлення пріоритету, яка дозволяє програмісту присвоювати певному рівню IRQ нижчий пріоритет (дно пріоритетного кільця) і, таким чином, змінювати дисципліну обслуговування.
Розглянені в занятті режими та команди забезпечують для користувача практично необмежені можливості у використанні в прикладних програмах модулів, керованих за перериваннями.
Ваш наступний крок
Програмні способи керування пріоритетами апаратних переривань дозволяють користувачу організувати більш ефективне обслуговування зовнішніх пристроїв обчислювальної системи. Але щоб написати відповідну коректну та працездатну програму, необхідно добре розбиратися в тонкощах структурних особливостей програм-оброблювачів переривання. їм присвячене наше наступне заняття.
Заняття 7. Принципи організації оброблювачів переривань
Тема заняття
Класифікація програм оброблювачів переривання.
Особливості структури оброблювачів переривання.
Мета заняття
Отримати уявлення про ознаки класифікації програм оброблювачів переривання.
Засвоїти послідовність дій, які виконує оброблювач переривань у фазах ініціалізації, активізації, виходу.
Зрозуміти та засвоїти відмінності між послідовністю дій по обробці переривань, що ініціюються сигналами INTR, NMI та командою INTn.
Навчитись розробляти резидентні та нерезидентні оброблювачі переривань.
Класифікація програм оброблювачів переривання
За способом організації програми оброблювачів переривання можна класифікувати як два альтернативні типи: що заміщують та перехоплюють вектори переривання.
До заміщуючих оброблювачів, наприклад, належить оброблювач INT 23 h (Control/Break), який передбачає заміну існуючого вектора без його збереження та поновлення.
По-іншому реалізується механізм в оброблювачі, побудованому за принципом перехоплювання переривання з наступним його поверненням, при цьому оброблювач зберігає значення перехопленого оригінального вектора.
Більшість макропрограм клавіатури належить до цього типу оброблювачів. Вони не заміщують вектор переривання INT 09h, а перехоплюють переривання та далі вже «вирішують», чи буде застосовуватись оригінальний оброблювач BIOS. У будь-якому випадку після виконання процедури обробки переривання керування буде передано тому оброблювачу, чий вектор був перехоплений. Більшість оброблювачів будуються саме за цим принципом.
Практика показує, що при написанні оброблювачів переривання необхідно дотримуватись певних правил та прийомів організації програм. Практично в будь-якому оброблювачі можна виділити такі основні розділи: ініціалізація оброблювача, активизація оброблювача, обробка переривання та вихід із оброблювача. Щодо оброблювача переривання можна сказати, що це індивідуальна задача, на якій майже не відображаються вимоги, що накладаються системою. Цього не можна гарантувати відносно інших розділів та компонентів оброблювача.
Ініціалізація оброблювача переривання
Задачею цієї фази є забезпечення коректного завантаження оброблювача з точки зору DOS та програм, що знаходяться в пам'яті одночасно з оброблювачем, прив'язка оброблювача до певних векторів переривань та інсталяція його в якості резидента. Завантаження оброблювача здійснюється так само, як і більшість програм — за допомогою системної функції 4Bh, але в процесі інсталяції резидента можуть бути відкритими файли, які операційною системою закриються після виходу із процедури ініціалізації. Вихід із фази ініціалізації полягає у звільненні тієї частини пам'яті, яка не може бути звільнена операційною системою і перебуває у виклику або системної функції 31h, або переривання INT 27h.
Як і функція 31h, переривання INT 27h належить до підкласу системних програмних засобів, які забезпечують реалізацію дуже важливого режиму TSR (Terminate but Stay Resident) — «Закінчити, але залишитись резидентом».
Перш ніж увійти в систему в якості резидента, програма для більш ефективного розподілення пам'яті повинна звільнити сегмент пам'яті, що містить копію оточення DOS для оброблювача переривання, що перехоплюється. При звичайному закінченні програми цей блок пам'яті очищується самою операційною системою, але при закінченні програми та призначенні її резидентом цього не відбувається.
Процедура звільнення пам'яті може бути виконана шляхом завантаження регістра ES значенням адреси сегмента, що міститься по зсуву 2Ch в PSP (префіксі програмного сегмента), та використанні функції 49h (звільнити розподілену пам'ять) системного переривання INT 21h.
Але, щоб оброблювач мав можливість знайти PSP, необхідно в початковий момент ініціалізації зберегти значення DS або ES, які в процесі виконання процедури ініціалізації можуть змінитись. Можна для пошуку та збереження адреси сегмента PSP активної програми використовувати системну функцію 62h, що залишає його в регістрі ВХ.
Фаза ініціалізації завершується виконанням функції виходу з резервуванням пам'яті для резидентної частини оброблювача переривання. Область пам'яті до позначки початку резидентної програми (LABEL START) резервується так, щоб наступні програми не змогли перекрити оброблювач.
Приклад побудови основних модулів фази ініціалізації.
;***Code segment*** Code segment
;***Execution start with this piece***
Assume csrcode, ds:code, ss:code, es:code
;***Program segment prefix copy***
mov ah, 62h ; Зберегти адресу сегмента
int 21h ; копії оточення DOS
mov PSPCopy, word ptr
[bx=2ch]
jmp short START ; Перехід до фази ініціалі-
зації з позначкою START
;***Free memory allocated to the environment ***
push es push bx
mov ah, 49h ;Встановити адресу сег-
mov bx, word ptr ;мента копії оточення DOS
PSPCopy mov es, bx
int 21h ;Очистити пам'ять від копії
pop bx ;оточення DOS поточної
pop es ; програми
Assume es:code
;***Terminate protecting memory below START*** mov dx, offset START встановити верхню межу
mov ax, 3100h ;пам'яті та вийти в DOS
int 21h
Code ENDS;
У практиці програмування оброблювач переривання ISR (Interrupt Service Routine) прив'язують не тільки до специфічних векторів, але і до одного з найчастіше вживаних: (08h, 09h, 16h, 21h, 23h, 24h, 28h).
Прив'язка оброблювача до певного вектора переривання здійснюється за допомогою функції 35h (отримати вектор) та 25h (встановити вектор) переривання Int21h. Значення оригінального вектора зберігається й у фазі виходу з оброблювача та використовується для повернення керування перехопленому вектору переривання.
;***Initialization piece***
Assume cs:code, ds:code, ss:code, es:code
START LABEL NEAR
;***Get int 8 vector and save***
push es
mov al, 08h
mov ah, 35h
int 21h
mov offset VectOld, bx ;Отримати вектор 08h
mov offset VectOld+2,es ; Зберегти сегмент та
pop es ;зміщення вектора
Assume es:code
;***Set int 8 vector to int 08h***
mov al, 08h
mov ah, 25h
mov dx, word ptr NewOff ;3авантажити нові
mov ds, word ptr NewSeg ; значення сегмента та
; зміщення Int 08h int 21h ;3амінити вектор 08h
Активізація обробки переривання
Активізація обробки переривання передбачає передачу керування програмі оброблювача переривання. При активізації лінії INTR відбувається читання з шини X байта номе-
ра переривання, запам ятовування стану поточної програми, читання відповідного вектора переривання та перехід за адресою, що знаходиться у векторі переривання. При дозволених перериваннях обробка починається після завершення виконання поточної команди.
Послідовність дій по обробці запиту, ініційованого сигналом INTR
1. Отримати номер вектора із контролера переривань, виконавши два цикли INTA.
2. Зберегти регістр прапорців у стеку.
3. Зберегти CS у стеку.
4. Зберегти IP у стеку.
5. Скинути IF.
6. Прочитати вектор переривання (IP : CS) із таблиці векторів переривання та помістити у відповідні регістри процесора.
7. Почати виконання оброблювача зі входу CS : IP.
Послідовність дій по обробці запиту, ініційованого сигналом NMI
1. Зберегти регістр прапорців у стеку.
2. Зберегти CS у стеку.
3. Зберегти IP у стеку.
4. Скинути IF та заборонити NMI. Прочитати вектор переривання 02h; помістити селектор у CS та зміщення в IP.
5. Почати виконання команд із входу CS : IP.
Послідовність дій по обробці запиту, ініційованого командою INT n
1. Зберегти регістр прапорців у стеку.
2. Зберегти CS у стеку.
3. Зберегти IP у стеку.
4. Прочитати вектор переривання п; помістити селектор у CS та зміщення в IP.
5. Почати виконання команд із входу CS : IP.
Фаза обробки переривання
При вході в програму обслуговування переривання ті регістри, які використовуються разом основною програмою та оброблювачем, повинні бути збережені. Для цього найкраще кожний з регістрів, що використовується, зберегти в стековій області пам'яті командою PUSH. Після завершення роботи програми оброблювача вміст збережених регістрів відновлюється командою POP.
Вихід із обробки переривання
Після виконання обробки переривання повернення до основної програми здійснюється за допомогою команди IRET. Ця команда «виштовхне» зі стеку попередні перериванню значення покажчика команди, сегмента коду та регістра прапорців. У результаті виконан-ня основної програми відновиться з того місця, де вона була перервана.
Для того, щоб оброблювач коректно повернув значення перехопленого вектора переривання, в його алгоритмі необхідно врахувати особливість повернення, пов'язану з тим, що поточний оброблювач повинен забезпечити можливість виконання збереженого оброблювача до передачі керування перерваній програмі. Виконання цієї умови необхідно в тих випадках, коли ставляться вимоги сумісності та перенесення оброблювача в середовищі DOS. При цьому мається на увазі, що у фазі ініціалізації відповідний вектор був збережений. Передача керування збереженому оброблювачеві здійснюється за допомогою команд CALLF або JMPF таким чином, щоб збережений оброблювач при закінченні виконання власної процедури повернення (IRET) зміг повернути керування поточному оброблювачеві.
;***Du the original interrupt*** pushf ;3берегти прапорці, щоб
calif VectOld ;IRET збереженого оброблю-
;вача відновила їх значення
Для завершення обробки апаратного переривання необхідно перед тим, як «виштовхнути» регістри та повернути керування перерваній програмі, ISR повинна повідомити контролер про закінчення обробки відповідного запиту на переривання. Після закінчення ISR відповідний розряд регістра обслуговування запиту повинен бути скинений командою «Неспецифічний кінець переривання».
;***Return from ISR***
mov al, 20h ;Формування та передача підпрограми
out |
AOh, al |
;EOI для веденого контро- |
|
|
лера |
imp |
$+2 |
; Часова затримка |
out |
20h, al |
;Формування та передача |
|
|
;ЕОІ для ведучого |
|
|
; контролера |
pop |
es |
;Відновлення вмісту |
pop |
ds |
;регістрів |
popa |
|
|
iret |
|
; Команда повернення з |
Практикум Лабораторна робота З
Тема роботи
Дослідження методів розробки резидентних програм, що перехоплюють апаратні переривання.
Мета роботи
Засвоїти основні особливості логічної побудови типової резидентної програми.
Навчитись розробляти програмні модулі, що аналізують стан клавіш клавіатури ПК.
Зрозуміти та засвоїти призначення функції 35h переривання 21h.
Отримати уявлення про призначення функції 09h переривання 21h.
Усвідомити основні особливості процедур збереження та відновлення штатних векторів переривання.
Сконцентрувати увагу на основних аспектах застосування функції 31h переривання INT 21h для виділення пам'яті під резидентну частину оброблювача переривання.
Уявити дії, що реалізуються функцією 49h переривання INT 21h при звільненні ділянки пам'яті після вивантаження резидента з пам'яті.
Навчитись створювати резидентні програми з параметрами завантаження, вивантаження та блокування повторного завантаження.
Вимоги
Для виконання роботи необхідні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування програмованого контролера переривань, а також знання та навички програмного доступу до регістрів ПКП.
На вінчестері комп'ютера повинно бути встановлено середовище програмування Borland C++ V3.01 в каталозі ВС.
Вправа 1
cmp al, 2 ;порівняння із заданим
;кодом 2 jz Beep ;якщо дорівнює, перехід на
;подачу звукового сигналу cmp al, 1 ; порівняння із заданим
;кодом 1 jz NoBeep ;якщо дорівнює, перехід
;на заборону звукового
; сигналу jmp Exit ; перехід на позначку Exit
NoBeep:
mov dx, 61h ;занесення в dx номера порту
in al, dx ;читання вмісту 61 порту
and al, 11111100b ; скидання бітів 0 та 1
out dx, al ;вивід в порт 61 для заборо ни видавання звуку
jmp Exit ; перехід на позначку Exit
Beep:
mov dx, 61h
in al, dx
and al, 11111100b
out dx, al
mov dx, 43h ; занесення в dx номера
; порту 43
mov al, 10110110b ;керуюче слово в al
out dx, al ;керуюче слово в порт 43h
dec dx ;відняти 43 - 1 = 42
;(порт лічильника каналу 2
;таймера) mov ax, 2ffh out dx, al ; занести до лічильника
;коефіцієнт перерахунку
;мл. байта mov al, ah out dx, al ;занести до лічильника
;коефіцієнт перерахунку
;ст. байта
mov dx, 61h
in al, dx
or al, 00000011b
out dx, al ;дозволити подачу
; звукового сигналу exit:
pop dx
pop ax popf
imp dword ptr cs:Old09
ENDP
======[ Опис змінних для резидентної частини ]======
Old09 dd ? ; змінна для збереження старого вектора
==[ Позначка кінця резидентної частини програми ]==== EndlSR db ?
******ПРОЦЕДУРА ІНСТАЛЯЦІЇ ПРОГРАМИ********;
;==[ Текст повідомлення програми інсталяції ]========
Help db 'recive_s.com /і - Встановлення в пам'яті',OAh.ODh
db 'recive_s.com /r — Вивантаження з пам'яті',0Ah,0Dh,$'
MesDoublelnst db 'Програма вже знаходиться в naM'HTi',0Ah,0Dh,'$'
MesReload db 'Программа вивантажена з naM'HTi',0Ah,0Dh,'$'
Meslnstall db 'Програма завантажена та
активізована ',0Ah,0Dh,'$'
MesNotlnstall db 'Програма не була інстальована',0Ah,0Dh,$g