Обработка аппаратных прерываний - 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.

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

  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
Похожие ответы