我在一个实时系统中有一个状态机,只有很少的(3个)状态。
typedef enum {
STATE1,
STATE2,
STATE3
} state_t;
然而,这些状态之间的转换需要相当长的时间,并且有它们自己的细分。因此,我有两个选择,要么扩展主状态机以表示所有中间状态:
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;
...
两种可能性都有其优点和缺点。大的状态机很容易变得混乱和复杂。然而,在第二种情况下保持所有状态的一致性也不是轻松的,许多函数需要关于全局状态和子状态的信息。
我想避免处理几个并行状态的复杂代码,例如:
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;
}
}
在处理这样的问题时,一般最好的方法是什么:使用许多小的和嵌套的状态机(其中包含许多无效组合),一个大的状态机还是其他方法?