stringtranslate.com

Конечный автомат, управляемый событиями

В вычислении конечный автомат ( FSM) управляется событиями , если переход из одного состояния в другое инициируется событием или сообщением . Это контрастирует с происхождением термина «конечный автомат» из теории синтаксического анализа, где автомат описывается как потребляющий символы или токены .

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

Пример на языке Си

Этот код описывает конечный автомат для очень простой системы автомобильного радио. По сути, это бесконечный цикл, который считывает входящие события. Конечный автомат имеет только 2 состояния: режим радио или режим CD. Событием является либо смена режима с радио на CD и обратно, либо переход к следующему (следующая предустановка для радио или следующий трек для CD).

/**********************************************************************/ #include <stdio.h> /***************************************************************************/ typedef enum { ST_RADIO , ST_CD } STATES ;     typedef enum { EVT_MODE , EVT_NEXT } СОБЫТИЯ ;     СОБЫТИЯ readEventFromMessageQueue ( void ); /**********************************************************************/ int main ( void ) { /* Состояние по умолчанию - радио */ STATES state = ST_RADIO ; int stationNumber = 0 ; int trackNumber = 0 ;                /* Бесконечный цикл */ while ( 1 ) { /* Прочитать следующее входящее событие. Обычно это блокирующая функция. */ EVENTS event = readEventFromMessageQueue ();         /* Переключить состояние и событие для выполнения правильного перехода. */ switch ( state ) { case ST_RADIO : switch ( event ) { case EVT_MODE : /* Изменить состояние */ state = ST_CD ; break ; case EVT_NEXT : /* Увеличить номер станции */ stationNumber ++ ; break ; } break ;                       case ST_CD : switch ( event ) { case EVT_MODE : /* Изменить состояние */ state = ST_RADIO ; break ; case EVT_NEXT : /* Перейти к следующему треку */ trackNumber ++ ; break ; } break ; } } }                    

Тот же пример в Ginr

Ginr — это промышленный компилятор, создающий многоленточные конечные автоматы из рациональных шаблонов, функций и отношений, выраженных в терминах полукольцевой алгебры. В примере ниже показана бинарная рациональная функция, эквивалентная приведенному выше примеру, с дополнительным переходом (nil, radio) для установки системы в ее начальное состояние. Здесь входные символы nil, mode, next обозначают события, которые управляют преобразователем с выходными эффекторами cd, nextTrack, radio, nextStation . Такие выражения, как правило, гораздо проще выражать и поддерживать, чем явные списки переходов.

StateMachine = ( (ноль, радио) ( (режим, cd) (следующий, следующий трек)* (режим, радио) (следующий, следующая станция)* )* ( (режим, cd) (следующий, следующий трек)* )?);

Компиляция создает последовательный (однозначный) двоичный преобразователь, отображающий последовательности событий в последовательности эффекторов, которые активируют функции устройства CD/радио.

StateMachine:prsseq;(СТАРТ) ноль [ радио ] 11 режим [ cd ] 22 режим [ радио ] 32 следующий [ следующийТрек ] 23 режим [ cd ] 23 следующий [ следующаяСтанция ] 3

Моделирование дискретных систем таким образом обеспечивает четкое разделение синтаксиса (приемлемого порядка событий) и семантики (реализации эффекторов). Синтаксический порядок событий и их расширение в семантическую область выражается в символической (полукольцевой) области, где ими можно манипулировать алгебраически, в то время как семантика выражается на процедурном языке программирования как простые функции эффекторов, свободные от синтаксических проблем. Рациональные выражения предоставляют краткие целостные карты протоколов, которые влияют на управление системой. Скомпилированные автоматы подвергаются постобработке для получения эффективных контроллеров для развертывания во время выполнения.

Смотрите также

Внешние ссылки

Дальнейшее чтение