ОргЭВМиС (3 сем) / Лаба №5 / Отчёт по Лабораторной Работе №5
.docxМинобрнауки России
Федеральное государственное автономное образовательное
учреждение высшего образования
«Санкт-Петербургский государственный электротехнический университет им. В.И. Ульянова (Ленина)»
(СПбГЭТУ «ЛЭТИ»)
Факультет компьютерных технологий и информатики
Кафедра вычислительной техники
ОТЧЕТ
по лабораторной работе №5
на тему:
«Использование аппаратных прерываний»
по дисциплине: «Организация ЭВМ и систем»
Выполнил студент группы №
Принял: Гречухин М.Н.
Санкт-Петербург
2018 г.
Содержание
Введение………………………………………………………………………………..3
-
Задание…………………………………………………………………………..3
-
Схема алгоритма.....…………………..............................................................…3
-
Текст программы………………………………………………………………..6
-
Пример запуска программы……………………………………………………7
Заключение……………………………………………………………………………..7
Введение
Цель работы: знакомство с различного вида аппаратными прерываниями и создание собственных подпрограмм обработки прерываний.
-
Задание
Разработать алгоритм и реализовать программу подключения собственной подпрограммы обработки прерывания и использовать её в цепочке со стандартной подпрограммой обработки прерывания от клавиатуры и системного таймера.
-
Схема алгоритма
Функция таймера: Обработчик прерывания клавиатуры:
Функция main:
-
Текст программы
#include <dos.h>
#include <conio.h>
void interrupt(far *oldvect)(...);
long ticks, clics;
void interrupt far timer(...) {
if (!(++ticks % 10))
cprintf("*");
_chain_intr(oldvect);
}
void interrupt far keyboard(...) {
clrscr();
cprintf("Kolichestvo cgenerirovannih scan-codov: %d\n\r", clics++);
cprintf("For end press ESC");
_chain_intr(oldvect);
}
int main()
{
char choice;
do {
clrscr();
cprintf("MENU:\n\r");
cprintf("1 - Timer (prerivanie 1Ch)\n\r");
cprintf("2 - Klaviatura (prerivanie 09h)\n\r");
cprintf("0 - Zavershenie raboti\n\r");
cprintf("Choose punkt menu: ");
choice = getche();
switch (choice) {
case '1':
clrscr();
ticks = 0;
oldvect = _dos_getvect(0x1c);
_dos_setvect(0x1c, timer);
cprintf("Timer ustanovlen (for end press any klavishu)\n\r");
getch();
_dos_setvect(0x1c, oldvect);
cprintf("\n\rPress any button...");
getch();
break;
case '2':
clics = 0;
oldvect = _dos_getvect(0x09);
_dos_setvect(0x09, keyboard);
while (getch() != 27) {}
_dos_setvect(0x09, oldvect);
break;
case '0':
cprintf("\nZavershenie raboti...");
break;
default:
cprintf("\n\rWrong klavisha. Eche raz ples.\n\r");
cprintf("Press any button...");
getch();
break;
}
} while (choice != '0');
return 0;
}
4. Пример запуска программы
Заключение