Обработка аппаратных прерываний - Free Pascal
Формулировка задачи:
Доброго вечера., кто нибудь сталкивался с таким? Необходимо написать подпрограмму обработки аппаратного прерывания системного таймера для генерации звука через каждые 5 секунд. Функция Delay() не в счёт. Прошу помощи, так как сам ума не приложу, как это сделать.
Решение задачи: «Обработка аппаратных прерываний»
textual
Листинг программы
{$IFNDEF Debug}
{$D-,S-,L-}
{$ENDIF}
{$B-,R-,V-,X+,N+,E-,A-,T-,F-,Q-,P-}
{.$G+}
program SysTimerSample;
uses
CRT;
const
Time1sec = 18; { 18.2065086 Гц }
Time10sec = 182; { 1 сутки = 1 573 040 (18 00 B0 h) }
Time1min = 1092;
Time1hour = 65543;
Time24hour = 1573040;
IntNum = $1C;
var
TimerDec: word;
var
OldExitProc: Pointer;
OldIntProc: Pointer;
var
Sounds: boolean; {состояние звучания динамика}
VectInt : Pointer absolute $0000:(IntNum*4 );
procedure DisableInterrupts; inline($FA); {cli}
procedure EnableInterrupts; inline($FB); {sti}
procedure Speaker;
begin
Sounds := not Sounds;
begin
if Sounds then
begin
Sound(440);
TimerDec := Time1sec * 1;
end
else
begin
NoSound;
TimerDec := Time1sec * 4;
end;
end;
end;
{$F+}
procedure SystemTimer; interrupt;
assembler;
asm
Dec TimerDec
test TimerDec, 0ffffH
jnz @@Skip
call Speaker
@@Skip:
pushf
call OldIntProc
end;
procedure DoneSysTimer; far;
begin
DisableInterrupts;
VectInt := OldIntProc;
EnableInterrupts;
ExitProc := OldExitProc;
end;
{$F-}
procedure InitSysTimer;
begin
OldIntProc := VectInt;
DisableInterrupts;
VectInt := @SystemTimer;
EnableInterrupts;
OldExitProc := ExitProc;
ExitProc := @DoneSysTimer;
end;
begin
TimerDec:=2;
Sounds := false;
InitSysTimer;
while not KeyPressed do;
ReadKey;
NoSound;
end.
Объяснение кода листинга программы
- Обработка аппаратных прерываний - программа использует процедуру SystemTimer, которая обрабатывает прерывания от системного таймера.
- Установка частоты прерываний - в начале программы устанавливается частота прерываний с помощью переменной TimerDec. Значение переменной TimerDec определяет, сколько раз в секунду будет вызываться процедура Speaker.
- Звуковые эффекты - процедура Speaker управляет звуковыми эффектами. Если переменная Sounds равна true, то программа проигрывает звук частотой 440 Гц, иначе - молчит.
- Временные константы - в программе определены константы, определяющие время в секундах, необходимые для работы с системным таймером.
- Регистры и процедуры - в программе определены регистры и процедуры, которые управляют прерываниями и звуковыми эффектами.
- Инициализация и обработка прерываний - процедура InitSysTimer инициализирует обработку прерываний, а процедура SystemTimer обрабатывает прерывания от системного таймера.
- Цикл программы - программа запускается в бесконечном цикле, пока не будет нажата клавиша. Когда клавиша нажата, программа завершается.
- Управление памятью - в программе используется динамическая память для хранения адресов функций, которые обрабатывают прерывания и звуковые эффекты.
- Безопасность - в программе предусмотрены меры безопасности, такие как проверка на прерывания и обработка ошибок.
- Управление выходом из программы - процедура DoneSysTimer используется для выхода из программы, когда требуется завершить ее работу.
- Заголовок программы - программа начинается с заголовка, который содержит информацию о версии компилятора и операционной системы.
- Оптимизация кода - в программе используются оптимизации кода, такие как использование инлайна и ассемблерных блоков для улучшения производительности.
- Управление таймером - программа использует системный таймер для управления временными задержками и звуковыми эффектами.
- Управление памятью - в программе используется динамическая память для хранения переменных и процедур.
- Управление вводом/выводом - программа использует функцию ReadKey для чтения клавиши, когда требуется завершить работу программы.
- Оптимизация производительности - в программе используются оптимизации производительности, такие как использование инлайна и ассемблерных блоков для улучшения скорости выполнения кода.
- Управление памятью - в программе используется динамическая память для хранения переменных и процедур.
- Безопасность - в программе предусмотрены меры безопасности, такие как проверка на прерывания и обработка ошибок.
- Оптимизация кода - в программе используются оптимизации кода, такие как использование инлайна и ассемблерных блоков для улучшения производительности.
- Управление памятью - в программе используется динамическая память для хранения переменных и процедур.