Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга. Гуржій. 1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.53 Mб
Скачать

Volatile long ticks;

Void main(void) {

ticks=OL; //Скидаємо лічильник

//тіків таймера

oldvect=_dos_getvect(Oxlc); //Запам'ятовуємо адресу

//старого оброблювача

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

_dos_setvect(Oxlc,timer); //Встановлюємо свій

//оброблювач

printf("\nTaftMep встановлено. Натисніть будь-яку"

"клавішу„.\п");

getch(); //Чекаємо натискання на

//будь-яку клавішу

_dos_setvect(Oxlc,oldvect); //Відновлюємо старий

//оброблювач переривання

//таймера

exit(O);

//Функція обробляє переривання таймера

Void _interrupt _far timer(void) {

ticks++; //Збільшуємо лічильник

//тіків таймера. Якщо //значення лічильника

if((ticks % 20) = 0) ВЕЕРО; //тіків кратне 20, видаємо

//сигнал на динамік //комп'ютера

//Викликаємо старий оброблювач переривання

_chain_intr(oldvect);

Особливості обробки апаратних переривань

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

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

Ще одне зауваження щодо обробки апаратних перери­вань. Якщо Ви повністю замінюєте стандартний оброблювач апаратного переривання, не забудьте в кінці програми видати байт 20h (команда скидання ЕОІ) в порт з адресою 20h (AOh для другого контролера І8259А). Ці дії необхідні для очищення регістра обслуговування переривання ISR. При цьому дозволяється обробка переривань з більш низьким пріори­тетом, ніж те, яке тільки що оброблялось.

Якщо Ви обробляєте переривання ICh, то добавка в кінці програми не потрібна, тобто це переривання є розширенням іншого переривання (переривання таймера).

Використання свопінгу в резидентних програмах

Однією з основних вимог, що висуваються до рези­дентних програм (у літературі такі програми називають TSR- (Terminate-but-Stay-Resident) програмами) — займати якнайменше пам'яті. У випадку використання складних TSR рекомендується використовувати свопінг.

Свопінг - це перенесення програми з диска в пам'ять, коли програма отримує керування, та обернене перене­сення даних та коду, коли закінчується час, відведений для роботи програми. Свопінг широко використовується в багатозадачних операційних системах та дозволяє за рахунок активного використання диска організувати псевдопаралельне виконання багатьох програм навіть при невеликих об'ємах ОЗП.

Стосовно до TSR свопінг означає зокрема те, що у пам'яті розміщується не вся TSR, а лише її мінімальне ядро. Визначивши необхідність та можливість активізації, ядро «підзавантажує» в пам'ять частину коду з диска, якої не вистачає. У випадку, коли для завантажуваного коду не вистачає пам'яті, будь-яка частина її вмісту копіюється на диск і на звільненому місці розміщується код TSR. Але завжди існує вірогідність того, що вивантажений з пам'яті на диск код — це фрагмент якого-небудь оброблювача переривань, код, який може знадобитись системі. Для того, щоб цього не відбулося, перед свопінгом TSR з диска маскуються апаратні переривання. Після завершення TSR повинна відновити пам'ять та дозволити переривання.

Особливу увагу необхідно приділити питанню ви­значення моменту часу, коли безпечно можуть виконуватись функції файлової системи DOS та бібліотечні функції мови СІ++, які опираються на них. Звертання до диска слід виконувати в моменти часу, коли прапорець повторного входження в DOS не дорівнює нулю та не виконується яка-небудь із функцій переривання INT13h. Відомо, що функції цього переривання керують роботою дискової системи на фізичному рівні. На жаль, відсутній який-небудь системний засіб визначення — чи активне в даний момент переривання 13h, чи ні. Тому необхідно передбачити використання відповідного фільтра, який повинен у зовнішній змінній відображати стан активізації функцій переривання 13h (наприклад, змінної inside_BIOS при вході в каскад ISR (Interrupt Service Routine)) присвоїти значення 1, а при виході — 0. Значення змінної необхідно перевіряти в додатку до прапорця повторного входу в DOS і не активізувати TSR до завершення переривання 13h. Встановлюваний фільтр повинен «прозоро пропускати» можливі значення, що повертаються «старим» оброблювачем 13h. Повернеш значен­ня завжди розміщуються в регістрах АХ та прапорцях.

Наведемо приклад фільтра переривання 13h. Фільтр реалізований у структурі простої резидентної програми. Для ілюстрації роботи фільтра під час активізації функцій переривання 13h вмикається динамік ПЕОМ.

;Програма Filtr_13. asm

.286

True EQU

False EQU

1 0

CSEG segment para 'code' assume cs: CSEG ORG lOOh

BEGIN:

jmp MAIN