
лаба ИСПОЛЬЗОВАНИЕ АППАРАТНЫХ ПРЕРЫВАНИЙ ЭВМ
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №5
по дисциплине «Организация ЭВМ и систем»
ИСПОЛЬЗОВАНИЕ АППАРАТНЫХ ПРЕРЫВАНИЙ
Студенты гр. 3352 |
|
|
Преподаватель |
|
|
Санкт-Петербург
2024
Задание на лабораторную работу
Реализовать программу для генерации звуков системного динамика через равные промежутки времени. Использовать собственную подпрограмму обработки прерывания в цепочке с подпрограммой обработки прерывания от системного таймера.
Алгоритмы и тексты отлаженных программ
Для работы созданы глобальные переменные программы: tick_Count – переменная, отвечающая за подсчет интервала между генерацией звука.
Frequency – переменная, задающая частоту звука
Interval_Ticks – задает интервал между сигналами, с учетом того, что в среде DOS таймер обновляется примерно 18.2 раза в секунду.
Функция Interrupt New_Timer (Рисунок 1): выполняет увеличения счетчика для генерации звука с заданным глобальной переменной интервалом и при его достижении воспроизводит звук с учетом выставленной частоты на продолжительность в миллисекундах. В конце для сохранения корректной работы программы вызывается старый обработчик для прерываний, которые могут происходить в программе (прерывание клавиатуры – kbhit 0x16).
Рисунок 1 — Функция Interrupt New_Timer
Функция main (Рисунок 2), получает адрес обработчика с помощью установленного прерывания 0x08, затем устанавливает новый обработчик и воспроизводит звук через заданные промежутки времени с заданной частотой, пока не будет нажата любая клавиша, что означает конец генерации (прерывание 0x16 (INT 16h)). Затем восстановится старый обработчик и программа будет завершена.
Рисунок 2 — Функция main
Текст программы:
#include <conio.h>
#include <dos.h>
void interrupt(*old_timer)(...);
volatile int tick_count = 0;
const int frequency = 700;
const int interval_ticks = 18;
void interrupt new_timer(...) {
tick_count++;
if (tick_count >= interval_ticks) {
tick_count = 0;
sound(frequency);
delay(200);
nosound();
}
(*old_timer)();
}
int main() {
old_timer = getvect(0x08);
setvect(0x08, new_timer);
while (!kbhit()) {
}
setvect(0x08, old_timer);
return 0;
}
Пример запуска программы
При запуске программы генерируется звук с частотой 700 Герц продолжительностью 200 мс примерно каждую секунду до нажатия любой клавиши.
Структурная схема аппаратных средств, используемых при выполнении программы с необходимой степенью детализации блоков
Рисунок 3 — Структурная схема
Выводы
В процессе выполнения лабораторной работы создана программа, генерирующая звуки системного динамика через равные промежутки времени с помощью собственной программы обработки прерывания. С использованием прерываний 0x08 (INT 08h) для собственного обработчика прерываний таймера, 0x16 (INT 16h) для клавиатурного завершения работы.