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