Достаточно часто программа, написанная для микроконтроллера, реализует несколько режимов работы. Так как в каждый отдельный момент времени требуется только один режим работы, то для каждого из них можно использовать отдельную программу-монитор, вызываемую как подпрограмма из основной программы-монитора. Именно он должен осуществлять переключение между режимами. Поэтому завершение работы любого из режимов должно осуществляться выходом из подпрограммы, реализующей этот режим.
В рассмотренном примере все время процессора неограниченно принадлежит одной программе-монитору. Это естественно, если время реакции любого алгоритмического блока, входящего в программу-монитор, одинаково. Однако возможны задачи, когда на одном микроконтроллере реализуются алгоритмические блоки, время реакции которых на поступающие от входных портов события должно быть различно. В таком случае используют разбиение времени микроконтроллера на временные слоты (интервалы). Это, как и в предыдущем случае, делается при помощи таймера. Однако для реализации устройства используется несколько подпрограмм-мониторов. Кроме них в состав программы вводится еще один алгоритмический блок — диспетчер. Собственно говоря, этот блок уже присутствовал в предыдущем примере. Это программа, осуществлявшая разбиение времени процессора на строго определенные интервалы.
Пример функциональной схемы устройства, в котором требуется различное время реакции на входное воздействие, приведен на рис. 7.17.
Рис. 7.17.
Можно было бы просто включить в основной монитор два различных счетчика и, анализируя их значения, вызывать соответствующие подпрограммы, но при этом возможна ситуация, когда общее время выполнения подпрограмм превысит значение временного слота монитора. Намного лучше заранее разбить время выполнения программы на временные слоты и выделить для каждой подпрограммы различные слоты. Это позволит отодвинуть выполнение некритичных по времени подпрограмм на более позднее время. Так реализуются параллельные программные потоки.
На временной диаграмме рис. 7.18 общее время выполнения программы (максимальное допустимое время реакции системы) разбито на шесть временных слотов. При этом первый, третий и пятый временные слоты выделены для второго монитора, что обеспечивает время реакции устройства
Для первой подпрограммы-монитора с временем реакции на входное воздействие
Рис. 7.18.
Таким образом, в одном процессоре реализовано два программных потока с различным временем реакции на изменение сигналов на выводах микроконтроллера. В принципе, вместо ожидания срабатывания таймера можно организовать еще один программный поток и разместить в этом потоке подпрограммы, время выполнения которых не является критическим для разрабатываемого устройства.
Теперь рассмотрим, как можно реализовать приведенные выше принципы организации программы на языке программирования С-51. Исходный текст программы приведен в листинге 7.30. Для нумерации слотов, на которые разбивается время, используется глобальная переменная NomSlot. Эта переменная используется как счетчик временных слотов. Именно по ее значению вызывается одна из подпрограмм-мониторов. Подпрограмма инициализации микроконтроллера такая же, как в примере, приведенном в листинге 7.27, и поэтому сейчас рассматриваться не будет.