Вижу, снова "не в коня корм", "хоть кол на голове теши", "понимание физики", ну и прочее "с точки зрения банальной эрудиции". Думал, накидают еще способов реализации КА. Но, видно, все от праздников еще не отошли. В общем, не давали - не давали мне покоя эти слова "входные сообщения". Я и так и эдак. Прикидывал разные варианты. Потом в голове стала крутиться табличная реализация автоматов. Прыгал от нее и к ней. И, кажется, нашел одно, очень неплохое, решение. Основная проблема в КА у меня была, когда в одном состоянии была проверка нескольких условий, и разные условия приводили к разным состояниям. Ассемблер тут ненавидят, поэтому опишу словами.
Условия могут быть разные. Это и опрос входов, регистров ввода-вывода, таймеров, ну и прочее. Все это разбросано. Поэтому, если главное условие смены состояний автомата - входные сообщения и в одном состоянии автомата может проверка нескольких условий, нужно собрать результат проверки всех условий одного автомата в одно входное слово-сообщение. Каждый результат проверки - флаг, семафор, обзовите, как хотите. Вот тогда все решается. Описываю на примере опроса кнопок. Что у нас есть. Нажатие хотя бы одной клавиши. Равенство предыдущего и текущего состояний кнопок. Опрос таймера. Ну, на таймер можно бит не отводить. Время не вышло - выход. Дальше. Есть два варианта проверки условий. Ведь не в каждом состоянии проверяются все условия. Садимся, просчитываем алгоритм. Создаем маски проверки условий на каждое состояние. Второй вариант - В каждом состоянии проверяются только нужные условия, соответственно формируются только необходимые слова-сообщения (выставляются требуемые биты).
Просчитываем алгоритм и пишем таблицу, что-то вроде этого:
;==============================================================================
.equ LET_KEYS_DOWN = 1<<0
.equ LET_LAST_CURR_KBD_EQUAL = 1<<1
;==============================================================================
Tab_Jmp_KBD_DRV:
.equ MAX_FSM_KBD_DRV_STATES = 6 ; Количество состояний автомата.
.equ _KEYS_INIT = 0
.db tab_h(Keys_Init)
.equ _KEYS_NONE = 1
.db tab_h(Keys_None)
.equ _KEYS_DOWN = 2
.db tab_h(Keys_Down)
.equ _KEYS_HOLD = 3
.db tab_h(Keys_Hold)
.equ _KEYS_WAIT_UP = 4
.db tab_h(Keys_Wait_Up)
.equ _KEYS_UP = 5
.db tab_h(Keys_Up)
Table_KBD_DRV:
.db tab_h(_KEYS)
; Текущее состояние, слово-сообщение, маска, следующее состояние
; _KEYS_INIT
.db _KEYS_INIT, 0b00000000, 0b00000000, _KEYS_NONE
; _KEYS_NONE
.db _KEYS_NONE, 0b00000001, 0b00000001, _KEYS_DOWN
; _KEYS_DOWN
.db _KEYS_DOWN, 0b00000011, 0b00000011, _KEYS_HOLD
.db _KEYS_DOWN, 0b00000000, 0b00000011, _KEYS_NONE
.db _KEYS_DOWN, 0b00000001, 0b00000011, _KEYS_NONE
.db _KEYS_DOWN, 0b00000010, 0b00000011, _KEYS_NONE
; _KEYS_HOLD
.db _KEYS_HOLD, 0b00000000, 0b00000001, _KEYS_WAIT_UP
.db _KEYS_HOLD, 0b00000001, 0b00000001, _KEYS_NONE
; _KEYS_WAIT_UP
.db _KEYS_WAIT_UP, 0b00000000, 0b00000001, _KEYS_UP
; _KEYS_UP
.db _KEYS_UP, 0b00000000, 0b00000001, _KEYS_NONE
.db _KEYS_UP, 0b00000001, 0b00000001, _KEYS_WAIT_UP
End_Table
Когда я это понял, сел, просчитал алгоритм, составил таблицу. После этого я практически не писал программу, а составлял ее из кусочков. (я пошел по второму варианту, в каждом состоянии проверял необходимые условия).
-
- Рекомендую с методикой программирования конечных автоматов разработанной А. А. Шалыто... - fk0(16.01.2012 01:22)
- Про коня в общем то верно ;) "нужно собрать результат проверки всех условий одного автомата в одно входное слово-сообщение" - фигня какая-то. Vladimir Ljaschko(192 знак., 15.01.2012 21:58)