Обработка аппаратных прерываний - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Доброго вечера., кто нибудь сталкивался с таким? Необходимо написать подпрограмму обработки аппаратного прерывания системного таймера для генерации звука через каждые 5 секунд. Функция Delay() не в счёт. Прошу помощи, так как сам ума не приложу, как это сделать.

Решение задачи: «Обработка аппаратных прерываний»

textual
Листинг программы
  1. {$IFNDEF Debug}
  2. {$D-,S-,L-}
  3. {$ENDIF}
  4. {$B-,R-,V-,X+,N+,E-,A-,T-,F-,Q-,P-}
  5. {.$G+}
  6. program SysTimerSample;
  7.  
  8. uses
  9.   CRT;
  10.  
  11. const
  12.   Time1sec = 18;       { 18.2065086 Гц                    }
  13.   Time10sec = 182;     { 1 сутки = 1 573 040 (18 00 B0 h) }
  14.   Time1min = 1092;
  15.   Time1hour = 65543;
  16.   Time24hour = 1573040;
  17.   IntNum = $1C;
  18. var
  19.   TimerDec: word;
  20.  
  21. var
  22.   OldExitProc: Pointer;
  23.   OldIntProc:  Pointer;
  24.  
  25. var
  26.   Sounds: boolean;    {состояние звучания динамика}
  27.  
  28.   VectInt       : Pointer absolute $0000:(IntNum*4  );
  29.   procedure DisableInterrupts; inline($FA); {cli}
  30.   procedure EnableInterrupts;  inline($FB); {sti}
  31.  
  32.   procedure Speaker;
  33.   begin
  34.     Sounds := not Sounds;
  35.     begin
  36.       if Sounds then
  37.       begin
  38.         Sound(440);
  39.         TimerDec := Time1sec * 1;
  40.       end
  41.       else
  42.       begin
  43.         NoSound;
  44.         TimerDec := Time1sec * 4;
  45.       end;
  46.     end;
  47.   end;
  48. {$F+}
  49.   procedure SystemTimer; interrupt;
  50.   assembler;
  51.   asm
  52.     Dec TimerDec
  53.     test TimerDec, 0ffffH
  54.     jnz @@Skip
  55.     call Speaker
  56.   @@Skip:
  57.     pushf
  58.     call  OldIntProc
  59.   end;
  60.  
  61.   procedure DoneSysTimer; far;
  62.   begin
  63.     DisableInterrupts;
  64.     VectInt := OldIntProc;
  65.     EnableInterrupts;
  66.     ExitProc := OldExitProc;
  67.   end;
  68.  
  69. {$F-}
  70.   procedure InitSysTimer;
  71.   begin
  72.     OldIntProc := VectInt;
  73.     DisableInterrupts;
  74.     VectInt := @SystemTimer;
  75.     EnableInterrupts;
  76.     OldExitProc := ExitProc;
  77.     ExitProc := @DoneSysTimer;
  78.   end;
  79.  
  80. begin
  81.   TimerDec:=2;
  82.   Sounds := false;
  83.   InitSysTimer;
  84.   while not KeyPressed do;
  85.   ReadKey;
  86.   NoSound;
  87. end.

Объяснение кода листинга программы

  1. Обработка аппаратных прерываний - программа использует процедуру SystemTimer, которая обрабатывает прерывания от системного таймера.
  2. Установка частоты прерываний - в начале программы устанавливается частота прерываний с помощью переменной TimerDec. Значение переменной TimerDec определяет, сколько раз в секунду будет вызываться процедура Speaker.
  3. Звуковые эффекты - процедура Speaker управляет звуковыми эффектами. Если переменная Sounds равна true, то программа проигрывает звук частотой 440 Гц, иначе - молчит.
  4. Временные константы - в программе определены константы, определяющие время в секундах, необходимые для работы с системным таймером.
  5. Регистры и процедуры - в программе определены регистры и процедуры, которые управляют прерываниями и звуковыми эффектами.
  6. Инициализация и обработка прерываний - процедура InitSysTimer инициализирует обработку прерываний, а процедура SystemTimer обрабатывает прерывания от системного таймера.
  7. Цикл программы - программа запускается в бесконечном цикле, пока не будет нажата клавиша. Когда клавиша нажата, программа завершается.
  8. Управление памятью - в программе используется динамическая память для хранения адресов функций, которые обрабатывают прерывания и звуковые эффекты.
  9. Безопасность - в программе предусмотрены меры безопасности, такие как проверка на прерывания и обработка ошибок.
  10. Управление выходом из программы - процедура DoneSysTimer используется для выхода из программы, когда требуется завершить ее работу.
  11. Заголовок программы - программа начинается с заголовка, который содержит информацию о версии компилятора и операционной системы.
  12. Оптимизация кода - в программе используются оптимизации кода, такие как использование инлайна и ассемблерных блоков для улучшения производительности.
  13. Управление таймером - программа использует системный таймер для управления временными задержками и звуковыми эффектами.
  14. Управление памятью - в программе используется динамическая память для хранения переменных и процедур.
  15. Управление вводом/выводом - программа использует функцию ReadKey для чтения клавиши, когда требуется завершить работу программы.
  16. Оптимизация производительности - в программе используются оптимизации производительности, такие как использование инлайна и ассемблерных блоков для улучшения скорости выполнения кода.
  17. Управление памятью - в программе используется динамическая память для хранения переменных и процедур.
  18. Безопасность - в программе предусмотрены меры безопасности, такие как проверка на прерывания и обработка ошибок.
  19. Оптимизация кода - в программе используются оптимизации кода, такие как использование инлайна и ассемблерных блоков для улучшения производительности.
  20. Управление памятью - в программе используется динамическая память для хранения переменных и процедур.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы