我在一个实时系统中有一个状态机,只有很少 (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;
}
}
解决此类问题的一般最佳方法是什么:许多小型嵌套状态机(具有许多无效组合)、一个大型状态机或其他任何东西?