Рябов В.Т. - Функции, структура и элементная база систем автоматического управления (1041593), страница 11
Текст из файла (страница 11)
ходить одновременно. Если приняли, что событие мо-
Программное
Внешнее
ментально и представляет собой точку на оси времени,
то вполне оправдано, что эти точки всегда различны и
события следуют одно за другим. События выступают
Локальное
Системное
как следствия каких-либо действий, либо, как причина
действий. Действия уже протяженны во времени и, по-
Рис. 1. 22.
этому могут протекать параллельно.
События могут непосредственно определяться
п рограммой (программные события) и быть внешни-
ми событиями по отношению к управляющей программе. Примером программного события является появление новой информации после завершения выполнения очередной команды программного кода.
Для фиксации внешних событий в микроконтроллерах предусмотрен механизм пре-рываний, с которым Вы очевидно знакомы . Позже мы еще раз рассмотрим этот механизм ввиду его важности для систем управления. Существуют и другие способы фиксации внеш-них событий диспетчером процессов, но для нас пока это особого значения не имеет.
Все события можно разделить на локальные, имеющие значение только для данного потока, и системные (рис.1. 22). Системные события каких либо процессов (потоков) участ-вуют в инициализации действий в других процессах или потоках. Иначе говоря, событие данного потока, или какое либо внешнее по отношение к управляющей программе событие (непосредственно не вычисляемое в ней), является системным, если оно обрабатывается ядром операционной системы (диспетчером процессов ) и может участвовать в перераспреде-лении вычислительных ресурсов между потоками. На рис.1.22 показано, что внешнее собы-тие не может быть локальным. Прерывание, предусмотренное для фиксации внешнего собы-тия, всегда запускает подпрограмму обслуживания этого прерывания , в результате чего пере-распределяются вычислительные ресурсы микроконтроллера. Если, конечно прерывание не запрещено, но тогда и внешнего события для системы управления не будет.
Процесс в нашем понимании, это совокупность событий и действий, объединенных общей природой и причинно-следственными связями и направленных на достижения постав-
ленной цели. С принятой в стандарте POSIX (Portable Operation System Interface Exchange)
точки зрения , процесс – это исполняемый программный код, расположенный в физически защищенном объеме памяти.
Последовательный процесс или поток (нить - thread) – это последовательность свя-
занных событий и действий . Каждое событие является следствием предыдущих действий и инициатором последующих. Рассмотренный в примере с роботом автоматный граф является типовым последовательным процессом или потоком. Событиями являются переходы из со-стояния в состояние, когда система задерживается в одном из состояний, осуществляются действия.
В тексте часто смешиваются понятия «процесс» и «поток», если проблемы распреде-ления и защиты памяти не существенны. С точки зрения программиста, обмен и взаимодей-ствие между потоками внутри процесса может осуществляться либо через глобальные пере-менные, либо, при переходе к вложенной подпрограмме, через стековый механизм обмена с
32
использованием локальных переменных. Причем, второй способ предпочтительнее и реко-мендован к использованию для лучшей структуризации программ и автономности потоков и процедур, используемых в них.
Обмен между процессами (точнее потоками разных процессов ) может осуществляться только через посылку сообщений. Это делает потоки максимально автономными. Каждый поток может осуществляться на различных микроконтроллерах, может быть автономно за-пущен и отлажен. Конечно, потоки влияют друг на друга. Так в приведенном примере с уста-новкой диффузионной сварки процессы нагрева и откачки связаны тем, что нагрев иниции-рует газовыделение, ухудшает вакуум и не должен привести к выходу давления за установ-ленные пределы. Но процесс нагрева может быть запущен автономно даже без откачки, если эмулировать сообщения о давлении при его запросах. Причем , процессу нагрева совершенно безразлично, какими средствами ведется откачка, ему важен лишь интерфейс процесса от-качки, чтобы запросить и получить фактическое значение давления.
Обмен информацией путем передачи сообщений между потоками может быть реали-зован и в рамках одного процесса, что также стандартизует механизм обмена и повышает ав-тономность программного кода потока.
Наибольшая автономность различных процессов и потоков позволяет распараллелить работы по программированию, повышает переносимость программного обеспечения, преем-ственность работ, использование программ сторонних производителей, облегчает отладку и сопровождение программного продукта.
Квантом будем называть отрезок потока между двумя системными событиями. Поток может содержать один или несколько квантов. В процессе выполнения кванта поток на дру-гие не влияет. Взаимодействия осуществляются только после завершения кванта. Организо-ванный таким образом интерфейс взаимодействия потоков (процессов) способствует их авто-номности.
Рассмотрим и обсудим введенные нами понятия на примере потока или процесса регу-лирования температуры. Написан он на некотором паскалеподобном языке и носит учебный характер. Процесс управляет подъемом температуры в печи от исходной до максимальной Tmax с градиентом dT градусов в 20 секунд.
Циклически повторяющийся каждые 20 секунд, квант регулирования температуры описан внутри оператора while T<Tmax do. В каждом проходе цикла встречается оператор wait_t(20,4), передающий управление диспетчеру процессов с указанием, включить этот квант в очередь на исполнение с задержкой в 20 секунд и приоритетом 4. Диспетчер процес-сов ведет очередь всех квантов и запускает их на исполнение, как только условия запуска бу-
дут выполнены.
thread NAGREV;
Var T, Tmax, dT ,Tf, Up, Tint, Tdif: real;
{T, Tmax Заданная, максимальная и }
{приращение температуры, Tf -фактическая температура,
}
{Up - управление, Tint, Tdif - постоянные времени.
}
Temp, Nagr : Channal;
{Аппаратные переменные, связанные
}
begin
{с датчиком температуры и регулятором напряжения.}
while T<Tmax do
{Пока заданная температура меньше максимальной
}
begin
T:=T+dT;
{рассчитать заданную температуру,}
Tf:=control(Тemp);
{измерить фактическую по каналу,}
Up:=PID(T,Tf, Tint, Tdif);
{рассчитать управление по ПИД- }
regulir(Up, nagr);
{закону и выдать значение Up по каналу nagr}
wait_t(20,4)
{передать управление диспетчеру процессов}
33
end; { с указанием (Ждать 20 секунд с приоритетом 4)}
Start(STAB_T, 1) {запуск процесса стабилизации температуры}
Start(SQUEEZING, 1) {запустить процесс сжатия образцов}
{через миллисекунду с приоритетом 0 }
Stop {Окончить процесс нагрева, когда температура достигнута.}
end.
Выполнение кванта этого потока (участка кода внутри оператора while T<Tmax, огра-ниченного оператором wait_t()), займет менее миллисекунды и повторяется квант с перио-дичностью в 20 секунд. Остальное время вычислительное ядро микроконтроллера свободно и может обрабатывать кванты других потоков. Именно за счет быстрой обработки квантов раз-личных потоков, даже на одном микроконтроллере добиваются квазипараллельности выпол-нения управляющей программы.
Каждый поток (и квант) имеет критерий начала. По сути, это описание системного события, когда поток должен быть поставлен в очередь на исполнение. Критерий начала по-тока должен быть описан в других потоках или процессах, либо определяться внешними по отношению к управляющей программе событиями. В приведенном примере оператор Start(STAB_ T, 0, 0) поставит в очередь диспетчеру процессов поток стабилизации температу-ры STAB_T c приоритетом 0, а оператор Start(SQUEEZING,0) - процесс сжатия свариваемых образцов. Приоритет говорит о том, что если времена запуска у различных квантов совпадут, диспетчер выберет квант с максимальным приоритетом. Здесь квант с нулевым приоритетом считается самым «важным», хотя в других операционных системах или средах исполнения жесткого реального времени ( ОСРВ) может быть и иначе. Например, в системе Neutrino, чем показатель приоритета выше, тем процесс приоритетнее. Если совпадут времена запуска и приоритеты квантов, выполняется обычно квант, ранее поставленный в очередь. Существуют и другие алгоритмы и даже стратегии ведения очереди потоков или квантов.
Оператор wait_t(20,4) передает управление диспетчеру процессов и ставит квант про-цесса NAGREV в очередь на исполнения через 20 секунд с приоритетом 4. Таким образом, за-вершение оператора wait_t() также является системным событием.
Критерий окончания указывает, что поток более не нужен и может не рассматривать-ся диспетчером процессов. Здесь это оператор Stop. После выполнения этой системной про-цедуры поток NAGREV будет исключен из очереди диспетчера процессов. Его дескриптор, в котором хранится контекст, адрес первой команды кода и условия запуска процесса, будет уничтожен, чтобы не перегружать диспетчер излишней работой. Далее процесс нагрева в технологическом цикле не нужен.