Простой пример, демонстрирующий необходимость быстрой реакции на событие, показан на Рис. 7.1. В данном случае нам необходимо измерить время между точками R сигнала электрокардиограммы (ЭКГ), который, по определению, является внешним событием реального времени. Временное разрешение должно быть не менее 0.1 мс, а наибольший интервал между максимальными значениями сигнала скорее всего не превысит 1.5 с. Для измерения этого интервала с заданными параметрами можно было бы использовать независимый 16-битный счетчик, работающий на частоте 10 кГц. Как мы увидим в главе 13, все микроконтроллеры среднего уровня имеют 8-битный счетчик, счетный регистр которого расположен по адресу h’01’. На Рис. 7.1 показано, как можно с помощью регистра h’3F’ организовать 16-битный счетчик. Этой конфигурации соответствует Программа 13.2, приведенная на стр. 462. Пока же предположим, что состояние счетчика можно считать из двух указанных регистров в любой момент времени. Если состояние счетчика, соответствующее последней точке R, было сохранено в двух временных регистрах, то, вычитая состояние счетчика, соответствующее текущей точке R, получим требуемую длительность.
Рис. 7.1.
Следующей задачей является обнаружение максимального уровня сигнала, поскольку сердце пациента, по определению, не синхронизировано с микроконтроллером! Один из возможных способов определения точки R заключается в непрерывном считывании этого сигнала и обработки его по алгоритму выделения максимума. В данном случае для обеспечения заданного временного разрешения применение метода
В качестве альтернативы можно воспользоваться внешним устройством, задачей которого будет обнаружение максимального уровня сигнала. Это устройство может быть как полностью аналоговым, так и построенным на базе микроконтроллера с аналого-цифровым преобразователем (см. Пример 14.2 на стр. 529). Независимо от реализации, этот блок будет посылать сигнал основному процессору при обнаружении точки R. Этот сигнал используется для прерывания работы микроконтроллера, который должен приостановить выполнение текущей задачи и изменить состояние счетчика не позже чем через 100 мкс.
В таких ситуациях, когда внешние процессы происходят сами по себе и никоим образом не синхронизированы с работой процессора, необходимо найти способ, посредством которого определенные события смогли бы прерывать выполнение программы и направлять процессор на выполнение требуемых действий. Опрос внешних событий применим при достаточно редком их возникновении и/или малом количестве отслеживаемых параметров и небольшом объеме вычислений. Вероятность пропуска какого-либо важного события можно уменьшить, увеличивая частоту опроса, однако в конце концов наступает такой момент, когда процессор уже не сможет ничего делать, кроме как читать данные от периферийных устройств. Вопрос недостаточности ресурсов особенно остро встает при необходимости опроса большого количества сигналов за короткий промежуток времени.
Обратной стороной мониторинга сигналов в реальном времени с использованием прерываний является усложнение аппаратных средств и аппаратно-программного интерфейса. Если вы совсем запутались, вообразите себе телефонную сеть. Можно построить такую сеть, при которой абонент снимал бы трубку, скажем, каждые 5 мин и спрашивал: «Эй! Есть тут кто-нибудь?» Не говоря уже о неудобствах (накладные расходы), связанных с выполнением этой операции[98], звонящему может просто надоесть ждать, и он повесит трубку. Разумеется, можно снизить вероятность такого события, увеличивая частоту опроса до, скажем, одного раза в минуту. Однако в этом случае вам придется проводить все свое время у телефона, принимая при этом всего несколько звонков в день. То есть 99 % ваших усилий будет затрачено впустую.
Данный пример достаточно нелеп, и на практике используется метод, основанный на прерываниях, когда вы поднимаете трубку, только услышав сигнал вызова. Такое решение гораздо эффективнее, но эта эффективность достигается за счет усложнения аппаратуры для телефонной компании. Кроме того, существует и другая проблема, заключающаяся в том, что вы (сравните с процессором) не имеете никакого понятия о том, когда зазвонит телефон. Ну а он, по закону подлости, зазвонит в самое неподходящее время. Так что вам (если только вы не железный) придется оторваться от текущих дел. К примеру, если вы в этот момент решали какую-либо задачу, вам придется потратить некоторое время на сохранение промежуточных результатов, с тем чтобы после разговора вы могли вернуться к ней.