状態が非常に少ないリアルタイムシステムのステートマシンがあります。
typedef enum {
STATE1,
STATE2,
STATE3
} state_t;
ただし、これらの州間の移行にはかなりの時間が必要であり、独自の細分化があります。したがって、2つの選択肢があります。メインのステートマシンを拡張して、すべての中間状態が表されるようにします。
typedef enum {
STATE1,
STATE1_PREPARE_TRANSITION_TO_STATE2,
STATE1_DO_TRANSITION_TO_STATE2,
STATE1_PREPARE_TRANSITION_TO_STATE3,
STATE1_DO_TRANSITION_TO_STATE3,
STATE2,
...
} state_t;
または、関連するメイン状態のネストされたステートマシンを作成します。
typedef enum {
STATE1_NOT_ACTIVE,
STATE1_NORMAL,
STATE1_PREPARE_TRANSITION_TO_STATE2,
STATE1_DO_TRANSITION_TO_STATE2,
STATE1_PREPARE_TRANSITION_TO_STATE3,
STATE1_DO_TRANSITION_TO_STATE3
} sub_state1_t;
...
どちらの可能性にも長所と短所があります。大きなステートマシンは非常に簡単に乱雑で複雑になります。ただし、2番目のケースですべての状態を一貫させることも簡単ではなく、多くの関数はグローバル状態とサブ状態の両方に関する情報を必要とします。
次のようないくつかの並列状態を処理する必要がある複雑なコードは避けたいと思います。
if ((global_state == STATE1) &&
(sub_state_1 == STATE1_DO_TRANSITION_TO_STATE2))
{
...
if (transition_xy_done(...))
{
global_state = STATE2;
sub_state_1 = STATE1_NOT_ACTIVE;
sub_state_2 = STATE2_NORMAL;
}
}
このような問題に対する一般的な最善のアプローチは何ですか:多くの小さくネストされたステートマシン(多くの無効な組み合わせを持つ)、1つの大きなステートマシンまたは他のもの?