Использование таймера для организации параллельных программных потоков 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование таймера для организации параллельных программных потоков



В рассмотренном примере все время процессора неограниченно принадлежит одной программе-монитору. Это естественно, если время реакции любого алгоритмического блока, входящего в программу-монитор, одинаково. Однако возможны задачи, когда на одном микроконтроллере реализуются алгоритмические блоки, время реакции которых на поступающие от входных портов события должно быть различно. В таком случае используют разбиение времени микроконтроллера на временные слоты (интервалы). Это, как и в предыдущем случае, делается при помощи таймера. Однако для реализации устройства используется несколько подпрограмм-мониторов. Кроме них в состав программы вводится еще один алгоритмический блок — диспетчер. Собственно говоря, этот блок уже присутствовал в предыдущем примере. Это программа, осуществлявшая разбиение времени процессора на строго определенные интервалы.

Пример функциональной схемы устройства, в котором требуется различное время реакции на входное воздействие, приведен на рис. 21.17.

Рис. 21.17. Схема устройства, реализующая разное время реакции на входные воздействия

Можно было бы просто включить в основной монитор два различных счетчика и, анализируя их значения, вызывать соответствующие подпрограммы, но при этом возможна ситуация, когда общее время выполнения подпрограмм превысит значение временного слота монитора. Намного лучше заранее разбить время выполнения программы на временные слоты и выделить для каждой подпрограммы различные слоты. Это позволит отодвинуть выполнение некритичных по времени подпрограмм на более позднее время. Так реализуются параллельные программные потоки.

На временной диаграмме рис. 21.18 общее время выполнения программы (максимальное допустимое время реакции системы) разбито на шесть временных слотов. При этом первый, третий и пятый временные слоты выделены для второго монитора, что обеспечивает время реакции устройства t2, реализуемое этим монитором, не более 3,3 мс. Это будет один программный поток.

Для первой подпрограммы-монитора c временем реакции на входное воздействие t1 выделен четвертый временной слот. Если времени одного слота для выполнения монитора 1 недостаточно, то есть еще два свободных временных слота. Подпрограмма-монитор 1 может быть разбита на три части, каждая из которых будет вызываться в своем временном слоте. При этом максимальное время реакции на входное событие у монитора 1 составит t1=10 мс.

Рис. 21.18. Пример временной диаграммы работы микроконтроллера с двумя подпрограммами-мониторами.

Таким образом, в одном процессоре реализовано два программных потока с различным временем реакции на изменение сигналов на выводах микроконтроллера. В принципе, вместо ожидания срабатывания таймера можно организовать еще один программный поток и разместить в этом потоке подпрограммы, время выполнения которых не является критическим для разрабатываемого устройства.

Листинг 21.30. Пример реализации диспетчера программ с двумя программными мониторами

char NomSlot=6;

void main(void)

{Init();

while(1)

{if(NomSlot==6)SborInf(); //Если шестой слот, то опросить выводы контр.

else if(NomSlot==5)Monit2();//Если пятый слот, то вызвать монитор 2

else if(NomSlot==4)Monit1();//Если четвертый слот, то вызвать монитор 1

else if(NomSlot==3)Monit2();//Если третий слот, то вызвать монитор 2

else if(NomSlot==1)Monit2();//Если первый слот, то вызвать монитор 2

 

if(--NomSlot==0)NomSlot=6;//Уменьшить номер слота и если первый
//слот уже выполнен, то перейти к шестому

PCON|=1; //Остановить ядро и подождать, пока не истечет 1,67 мс

//------ подготовить таймер к следующему циклу --------------------------

TF=0; //Обнулить флаг переполнения таймера

TH0=(-1666)>>8; //Задать следующий интервал времени, равный 1,67 мс

TL=-1666; //(6 слотов = 10 мс)

}

}

Теперь рассмотрим, как можно реализовать приведенные выше принципы организации программы на языке программирования C‑51. Исходный текст программы приведен в листинге 21.30. Для нумерации слотов, на которые разбивается время, используется глобальная переменная NomSlot. Эта переменная используется как счетчик временных слотов. Именно по ее значению вызывается одна из подпрограмм-мониторов. Подпрограмма инициализации микроконтроллера такая же, как в примере, приведенном в листинге 21.27, и поэтому сейчас рассматриваться не будет.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 223; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.15.205 (0.005 с.)