gpt4 book ai didi

c - 大型与嵌套状态机

转载 作者:太空狗 更新时间:2023-10-29 15:51:33 24 4
gpt4 key购买 nike

我在实时系统中有一个状态机,只有很少 (3) 个状态。

typedef enum {
STATE1,
STATE2,
STATE3
} state_t;

然而,这些状态之间的转换需要相当长的时间,并且有自己的 segmentation 。所以我有两个选择,要么扩展主状态机,以便表示所有中间状态:

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;
}
}

解决此类问题的一般最佳方法是什么:许多小型嵌套状态机(具有许多无效组合)、一个大型状态机或其他任何东西?

最佳答案

许多小型状态机将为您提供更多的代码灵 active ,尤其是当您需要重新设计任何内容时。那么您应该(希望)能够更改嵌套状态机而无需更改任何其他嵌套状态机。

拥有更大的转换表不应该导致更长的查找,因为我假设您在内存中合理地布置了表。如果有的话,你实际上应该能够从大机器中获得更多的速度,因为你没有额外的一两个步骤,你可能需要使用小型状态机在它们之间干净地转换。但考虑到这种方法增加了复杂性,我建议如下:使用嵌套状态机进行设计,然后一旦一切正常,如有必要,重构为单个状态机以获得一点速度提升。

关于c - 大型与嵌套状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com