ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
30 июня
299442 Топик полностью
mazur (15.01.2012 21:41 - 22:07, просмотров: 182) ответил mazur на Прочитал это сообщение ->, и с того времени вот эти слова не давали мне покоя:
Вижу, снова "не в коня корм", "хоть кол на голове теши", "понимание физики", ну и прочее "с точки зрения банальной эрудиции". Думал, накидают еще способов реализации КА. Но, видно, все от праздников еще не отошли. В общем, не давали - не давали мне покоя эти слова "входные сообщения". Я и так и эдак. Прикидывал разные варианты. Потом в голове стала крутиться табличная реализация автоматов. Прыгал от нее и к ней. И, кажется, нашел одно, очень неплохое, решение. Основная проблема в КА у меня была, когда в одном состоянии была проверка нескольких условий, и разные условия приводили к разным состояниям. Ассемблер тут ненавидят, поэтому опишу словами. Условия могут быть разные. Это и опрос входов, регистров ввода-вывода, таймеров, ну и прочее. Все это разбросано. Поэтому, если главное условие смены состояний автомата - входные сообщения и в одном состоянии автомата может проверка нескольких условий, нужно собрать результат проверки всех условий одного автомата в одно входное слово-сообщение. Каждый результат проверки - флаг, семафор, обзовите, как хотите. Вот тогда все решается. Описываю на примере опроса кнопок. Что у нас есть. Нажатие хотя бы одной клавиши. Равенство предыдущего и текущего состояний кнопок. Опрос таймера. Ну, на таймер можно бит не отводить. Время не вышло - выход. Дальше. Есть два варианта проверки условий. Ведь не в каждом состоянии проверяются все условия. Садимся, просчитываем алгоритм. Создаем маски проверки условий на каждое состояние. Второй вариант - В каждом состоянии проверяются только нужные условия, соответственно формируются только необходимые слова-сообщения (выставляются требуемые биты). Просчитываем алгоритм и пишем таблицу, что-то вроде этого: ;============================================================================== .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 Когда я это понял, сел, просчитал алгоритм, составил таблицу. После этого я практически не писал программу, а составлял ее из кусочков. (я пошел по второму варианту, в каждом состоянии проверял необходимые условия).