Обработка аппаратных прерываний - 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 для чтения клавиши, когда требуется завершить работу программы.
- Оптимизация производительности - в программе используются оптимизации производительности, такие как использование инлайна и ассемблерных блоков для улучшения скорости выполнения кода.
- Управление памятью - в программе используется динамическая память для хранения переменных и процедур.
- Безопасность - в программе предусмотрены меры безопасности, такие как проверка на прерывания и обработка ошибок.
- Оптимизация кода - в программе используются оптимизации кода, такие как использование инлайна и ассемблерных блоков для улучшения производительности.
- Управление памятью - в программе используется динамическая память для хранения переменных и процедур.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д