-- Избежать миллиона флагов, следящих, что конкретно происходит в программе
-- Выполнять действия асинхронно, не используя при этом многопоточность или прерывания.
Покажу короткий автомат, который посылает запрос, ждёт ответа, а потом возвращается к началу.
void main(void)
{
for( ;; )
{
//главный цикл микроконтроллера
automaton();//вызов автомата
//таких автоматов в главном цикле могут быть десятки, каждый занимается своим делом
//и друг другу не мешают
}
return 0;
}
void automaton()
{
static int state=0;
switch(state)
{
case 0:
send_request();
state=1;
break;
case 1:
if(answer_ready())
state=2;
break;//если условие не выполнено, state остаётся равным 1
case 2:
read_answer();
state=0;
break;
}
}
Что тут происходит: при каждом вызове автоматной функции она начинает выполнять кусок кода, соответствующий текущему состоянию. В зависимости от состояния происходит переход к следующему куску. Тут куска всего три.
0: перейти к 1
1: если ответ готов, перейти к 2. если не готов, остаться в 1
2: перейти к 0
Можно нарисовать схему, но я этого делать не буду.
Так вот, в чём проблема: в обозначении состояний. Я в своих автоматах состояния просто нумерую 0, 1, 2...
А мой коллега из дружественной организации даёт состояниям названия, например, FSM_INITIAL_STATE.
И оба подхода плохие.
Номера:
-- цифры бессмысленны, без комментариев непонятно, зачем нужен переход и куда мы переходим
-- если необходимо внести промежуточные состояния, то либо приходится их размещать в конце автоматной функции (с бОльшими номерами), либо сдвигать нумерацию
Названия:
-- осмысленные названия состояний получаются очень длинными, могут даже приближаться к длине самого кода, который выполняет данное состояние (например, выше нулевое состояние можно назвать FSM_SEND_REQUEST)
-- видя название состояния, тяжело понять, где его искать в автоматной функции. Выше оно или ниже текущей строки, текущего состояния? Или каждый раз пользоваться поиском?
Однозначного решения у меня нет. Может быть, об этом написано в какой-то книжке про автоматы, но я их не читал. У меня есть решение только одной из проблем.
Все помнят бейсик? Что там строчки нумеровались 10, 20, 30. А зачем они так нумеровались? А как раз для того, чтобы между строчками можно было впихнуть ещё парочку строк не проводя полной перенумерации.
Вот и решение. Состояния можно нумеровать не 0, 1, 2, а 0, 10, 20.