
- •Передмова
- •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. Архітектура та принципи функціонування годинника реального часу
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