www.aeom.ho.ua
Лабораторна робота №5
ТЕМА: Програмування контролера переривань і8259 в IBM PC / АТ.
МЕТА: Набути навичок з програмування контролера переривань, розробляти й встановлювати власні обробники апаратних та програмних переривань.
Короткі теоретичнi вiдомостi
З кожним перериванням зв`язана та чи інша подія. Система повинна розпізнати яке переривання з яким номером відбулося і яку відповідну процедуру треба виконати. Відомі 2 види переривань: апаратне і програмне. Програмні переривання зручно використовувати для організації доступу до окремих спільних для всіх програм модулям. Прикладні програми можуть самі встановлювати свої обробники переривань, для їх послідуючого використовування іншими програмами. Для цього обробники переривань повинні бути резидентними у пам`яті.
Апаратні переривання викликаються фізичними пристроями і проходять асинхронно. Ці переривання інформуть систему про подію зв`язану з роботою перефирійних пристроїв. Використовування переривань при роботі з повільними зовнішніми пристроями дозволяє сумістити ввод\вивід з обробкою даних у ЦП і завдяки цьому підвищується працездатність системи.
Деякі переривання зарезервовані для використання самим процесором. Іноді бажано зробити систему, яка не реагує на всі або окремі переривання, для цього використовують маскування переривань.
Складання програм обробника переривань і заміна стандартних обробників MS DOS I BIOS є відповідальною роботою. Необхідно врахувати усі тонкощі роботи апаратури і взаємодію програмного і апаратного забезпечення.
Таблиця векторів переривань
Для того, щоб зв`язати адресу обробника переривань з номером переривання використовують таблицю векторів переривань, яка займає 1 Кб оперативної пам`яті від 0000:0000 до 0000:03FF. Таблиця має 256 елементів FAR обробників. Ці елементи звуться векторами переривань. У першому слові елемента таблиці записано зміщення, а у другому адреса сегмента обробника переривань. void (* interrupt_table [256]);
Загальна структура системи переривань АТ
Апаратні переривання: масковані, немасковані.
Програмні переривання: BIOS, DOS, користувача.
Виключні ситуації: помилки, пастки, аварійне завершення.
IRQ0 – системний таймер;
IRQ1 – клавіатура;
IRQ2 – каскадування КП;
IRQ3 – СОМ2;
IRQ4 – СОМ1;
IRQ5 – порт принтера RTP2;
IRQ6 – гнучкі магнітні диски;
IRQ7 - порт принтера RTP1;
IRQ8 – RTC;
IRQ9 – відеоадаптер;
IRQ10 – резерв користувача;
IRQ11 – резерв користувача;
IRQ12 – резерв користувача;
IRQ13 – співпроцесор;
IRQ14 – жорсткі магнітні диски HMD;
IRQ15 – резерв користувача.
Помилки – це виключні ситуації, які знаходяться і обслуговуються після вибірки до виконання команди, що обслуговується.
Пастки – це виключні ситуації проя кі повідомляється одразу після виконання команди, яка привела до появи даної ситуації.
Аварійне завершення – це виключні ситуації при неможливості точно локалізувати джерело помилки і використовуються при виявленні глобальних помилок.
Заміна таблиці векторів переривань
Якщо потрібно організувати обробку деяких переривань, то програма повинна переназначити вектор переривань на власний обробник. Це можна зробити, змінивши зміст відповідного елемента таблиці вектора переривань.
Послідовність дій для нерезидентних програм обробки переривань:
1. Прочитати зміст елементів таблиці вектора переривань для вектора з потрібним вам номером.
2. Запам`ятати цей зміст із області даних програми.
3. Встановити нову адресу у таблиці векторів переривань так, щоб вона відповідала початку вашої програми обробки переривань.
4. Перед завершенням роботи програми прочитати із області даних адресу старого обробника переривань і записати його у таблицю векторів переривань.
Для читання вектора використовується функція 35h переривання INT 21h.
У лістингу 6.1 наведено код програми, який встановлює власний обробник переривання на вектор 1Ch, який постійно виводить символ “#” у верхньому правому кутку екрану.
Лістинг 6.1 – Програма постійного виведення символа “#” у верхньому правому кутку екрану за допомогою встановлення обробника переривання 1Сh
#include <stdio.h>
#include <dos.h>
#pragma check_stack(off)
#pragma check_pointer(off)
#define INTR 0X1C
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
void interrupt (*oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS) //власний обробник handler, який
//у знакомісце 0 текстової відеопам’яті
//виводить символ "#"
{
pokeb(0xb800,0,'#'); //веведення символа "#"
oldhandler(); //виклик попереднього обробника 1Ch
}
int main(void)
{
printf("Програма встановлення власного обробника 1Сh\n");
oldhandler = getvect(INTR); //збереження попереднього вектора 1Ch
setvect(INTR, handler); //встановлення нового обробника handler
printf("\tОБРОБНИК 1Ch ВСТАНОВЛЕНО!\nДля виходу натисніть будь-яку клавішу.\n");
getch();
return 0;
}
Примітка: для перевірки роботи програми необхідно запустити її за допомогою оболонки VC або FAR (рисунок 6.1).
Рисунок 6.1
Особливості обробки апаратних переривань
Поступаючі переривання запам`ятовуються у регістрі запиту на переривання IRR. Кожний біт із восьми у цьому регістрі відповідає перериванню. На обробку переривання інформація береться із регістра обслуговування переривань ISR. Перед видачею запиту на переривання у процесор, перевіряється зміст регістра маски переривань IMR. Якщо переривання даного рівня не замасковане, то видається запит на переривання.
Найбільш цікавими з точки зору програмування контролера переривань являються регістри маски переривань.
ЗАВДАННЯ
Розробіть структурну схему організації системного часу в ІВМ РС / АТ (BIOS → Інтервальний таймер і8254 /канал 0/ → КП /IRQ0: INT 8h/, BIOS → RTC → Таймер ОС).
Розробити та ініціалізувати власний обробник переривання 1Ch, який за допомогою таймера операційної системи (комірки пам’яті за адресою 046Ch) о 12:30 год. переводить системний час ПК згідно варіанта:
на 8 годин 59 хвилин 40 секунд назад;
на 2 години 30 хвилин вперед;
на 1 годину 10 хвилин назад;
на 5 годин 8 хвилин 9 секунд назад.
на 5 годин 35 секунд вперед;
на 1 годину 25 хвилин 5 секунд назад;
на 3 години 2 хвилини вперед;
на 1 годину 12 хвилин вперед;
на 7 хвилин 10 секунд вперед;
на 9 годин 50 хвилин 1 секунду назад;
(!) Примітка: ( [номер_варіанта] = [номер_у_списку] % 10 ).
Розробити блок-схему алгоритма та програму, яка за допомогою перепрограмування контролера переривань замасковує обробку переривання від floppy-дисковода.
ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ
На базі якої мікросхеми реалізовано КП у ІВМ РС?
Призначення та місце КП в обчислювальній системі. Система переривань.
Алгоритм функціонування КП.
Що таке вектор переривання? Суть і призначення таблиці векторів переривань. Де вона знаходиться?
Роль і місце КП в організації системного часу в ПК IBM PC.
Алгоритм програмування КП.
Що відбувається з запитами на переривання, якщо відповідний IRQ замасковано?
Особливості обробки апаратних переривань.
Рівні пріоритетів обробки переривань. Як здійснюється їх зміна?
Яке місце і роль КП у принципі відкритості системи? Чи можливо організувати принцип відкритості без КП?