Системное программное обеспечение персональных ЭВМ

Работа в реальном времени


6.3. Работа в реальном времени

В целом ряде приложений необходима привязка действий программы к определенным моментам времени или к временным интервалам. Наиболее простой подход заключается в циклическом опросе системного счетчика времени (по сути, такой подход применялся в примере 6.1 для управления длительностью звучания нот). Если же требуется заполнить паузы ожидания какой-либо полезной работой, приходится прибегать к расширению прерывания таймера. Для этого случая создается дополнение к прерыванию таймера, которое подсчитывает тики таймера параллельно с BIOS и по истечении заданного интервала либо сама выполняет требуемые действия, либо устанавливает какой-то флаг, по которому эти действия выполнит программа переднего плана. Характерным примером такой задачи является создание фонового музыкального сопровождения - музыка играет в то время, как программа производит вычисления. В приведенном примере 6.5 программа исполняет мелодию, закодированную в массиве MUS, где каждая нота описывается двумя числами: ко- эффициентом деления основной частоты таймера и длительностью звучания (в тиках).

При иницировании музыки переменные N и NM устанавливают- ся в начальные значения и подменяется вектор прерывания 8. "Полезная" работа программы переднего плана заключается в чтении кода нажатой клавиши, получении и выводе на экран те- кущего времени (это дает нам возможность убедиться в том, что работа системной службы времени не нарушена). При нажа- тии клавиши Esc программа и музыка завершаются. При поступ- лении очередного прерывания 8 управление получает функция newtime. Она прежде всего вызывает системный обработчик пре- рывания 8, а затем уменьшает счетчик тиков NM. Если счетчик тиков исчерпан, то отключается звук, программный цикл обес- печивает короткую паузу между нотами, а затем выбирается ко- эффициент деления для очередной ноты, который используется для программирования канала 2 таймера, а ее длительность ус- танавливается в счетчик NM.



Содержание раздела