2.3 Специфіка програмування апаратних переривань на прикладі переривання від СОМ порта
Ініціалізація COM-порта
СОМ портом управляє мікросхема UART. Тому спочатку проведемо ініціалізацію UART. Cкидуємо регістри стану лінії, стану модему і даних. Це досягається простим зчитуванням значень цих регістрів:
; скидаємо регістр стану лінії
mov dx,LSR; LSR - адреса регістра стану лінії
in al,dx
jmp $+2; затримка
; скидаємо регістр стану модему
mov dx,MSR; де MSR - адреса регістра стану модему
in al,dx
jmp $+2; затримка
; скидаємо регістр даних
mov dx,DAT; де DAT - адреса регістра даних
in al,dx
jmp $+2; затримка
Ці регістри необхідно скинути для того, щоб надалі не заважали старі значення, які могли залишитися від роботи інших програм.
Після того як ми скинули регістри UART, можна приступити власне до ініціалізації COM-порту. Під час ініціалізації задається формат даних - довжина слова, кількість стопових бітів, наявність контролю по парності і швидкість обміну.
Для задання швидкості обміну даними треба перевести регістр даних і регістр керування перериваннями в режим уведення значення дільника частоти тактового генератора. Цей режим встановлюється записом одиниці в старший біт регістра керування лінією (LCR):
// переводимо регістр даних і регістр
// керування перериваннями у режим уведення
// значення дільника частоти тактового генератора
ctl = inp(LCR); // LCR - адреса регістра керування
// установлюємо старший біт регістра
outp(LCR_N, ctl | 0x80);
// обчислюємо значення для дільника частоти
//(змінна baud визначає швидкість обміну,
// яку ми хочемо установити)
switch(baud) {
case 110: div = 1040; break;
case 150: div = 768; break;
case 300: div = 384; break;
case 600: div = 192; break;
case 1200: div = 96; break;
case 2400: div = 48; break;
case 4800: div = 24; break;
case 9600: div = 12; break;
case 19200: div = 6; break;
case 38400: div = 3; break;
case 57600: div = 2; break;
case 115200: div =1; break;
default: return(-1); break;
}
// записуємо значення дільника частоти,
// молодший байт у регістр даних, старший –
// у регістр керування перериваннями
// ICR - адреса регістра керування перериваннями
outp(ICR, (div >> 8) & 0x00ff);
// DAT - адреса регістра даних
outp(DAT, div & 0x00ff);
// переводимо регістр даних і регістр
// керування перериваннями назад у звичайний
// для них режим
ctl = inp(LCR); // LCR - адреса регістра керування
//скидаємо старший біт регістра
outp(LCR, ctl & 0x7f);
Потім треба визначити формат даних. Для цього запишемо нове керуюче слово в регістр LCR:
// записуємо нове керуюче слово
outp(LCR, 00000011B);
// керуюче слово 00000011B встановлює довжину
// слова 8 біт, один стоповий біт, скасовує перевірку
// на парність і скасовує режим фіксації парності
Останнім кроком в ініціалізації регістрів UART є ініціалізація регістра керування перериваннями. Ми повинні спеціально вказати послідовному адаптеру, коли він повинен генерувати переривання.
Створення процедури обробки переривання для СОМ порта
Послідовний асинхронний адаптер можна запрограмувати таким чином, що кожний раз, коли він прийме чи передасть черговий байт, буде згенероване відповідне переривання. Переривання можуть генеруватися асинхронним адаптером у таких випадках:
змінився стан лінії приймача: відбулося переповнення приймача, відбулася помилка парності чи синхронізації, лінія перейшла в стан BREAK (розрив);
дані прийняті і доступні для читання через регістр даних;
регістр передавача порожній;
змінився стан модему: змінився стан ліній CTS, RI, DCD, DSR.
Існує можливість окремо забороняти чи дозволяти певний тип переривання. Для цього необхідно встановити відповідні біти в регістрі керування перериваннями.
Кожному COM-порту відповідає, крім базової адреси його регістрів, лінія IRQ [3]. Стандартний розподіл апаратних переривань такий:
COM-порт | IRQ | Номер переривання |
COM1 | IRQ4 | INT 0Ch |
COM2 | IRQ3 | INT 0Bh |
COM3 | IRQ4 | INT 0Ch |
COM4 | IRQ3 | INT 0Bh |
Для встановлення власного оброблювача переривання від СОМ порту необхідно замінити процедуру обробки переривання, яка встановлена операційною системою або БІОСом на власну процедуру обробки переривання. Після цього дозволити переривання, яке було встановлено.
При реалізації процедури обробки переривання необхідно керуватися таким алгоритмом:
... та модернізації переліку послуг, в основу проекту були покладені принципи, аналогічні принципам конструювання послуг інтелектуальної мережі. 2. Системи комп'ютерної телефонії фірми «Беркут» Науково-виробнича фірма «Беркут» (Санкт-Петербург) є виробником широкого спектра систем телекомунікаційного обладнання, розроблюваних на базі власної платформи комп'ютерної телефонії та прикладного ПЗ. ...
0 комментариев