学习杂记---FSM(有限状态机)应用

学习杂记---FSM(有限状态机)应用

FSM核心和作用

全称finite-state-machine,在有限个状态下,通过外部调用去发生状态的转移和其他动作的模型

分类

F(S) -> (A, S’) 型状态机:下一状态只由当前状态决定
F(S, E) -> (A, S’) 型状态机:下一状态不但与当前状态有关,还与当前输入值有关
下面是通过Java实现F(S, E) -> (A, S’) 型状态机的方式

Java实现

事件枚举

public enum EventEnum {
    PASS
    FAILED
    MANUAL
}

Map的Key和Value维护

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class FSMKey {

    private boolean condition1;
    private boolean condition2;
    private StatusEnum sourceStatus;
    private EventEnum event;
}
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class FSMValue {
    private StatusEnum targetStatus;
}

status_mapping

数据库数据仅供参考

condition1conditon2event
truetruePASS
truefalsePASS
falsetruePASS
falsefalsePASS
truetrueFAILED
truefalseFAILED
falsefalseMANUAL
public interface StatusService {
    //sourceStatus表示当前状态,最后会把转移后的状态return;
    //通过event和condition1,condition2去映射到要转移到状态
    StatusEnum action(boolean condition1, boolean condition2,
        StatusEnum sourceStatus, EventEnum event);

}
@Service
public class StatusServiceImpl implements StatusService {
    /**
    * 在第一次调用action的时候,构建一个fsmMap,去match要转移的状态
    */
    private volatile Map<FSMKey, FSMValue> fsmMap;
    /**
    * 因为condition和event的组合情况较多,所以将映射关系存在数据库中的staus_mapping表
    * PS:个人理解通过Apollo之类的配置中心也很好
    */
    private void initFSMMapIfNeed() {
        if (fsmMap == null) {
            synchronized (this) {
                if (fsmMap == null) {
                    fsmMap = new HashMap<>();
                    List<StatusMapping> mappingList = statusMappingService.list();
                    mappingList.forEach(mapping ->
                        fsmMap.put(
                            FSMKey.builder()
                                .condition1(mapping.getCondition1())
                                .condition2(mapping.getCondition2())
                                .sourceStatus(mapping.getSourceStatus())
                                .event(mapping.getEvent())
                                .build(),
                            new FSMValue(mapping.getTargetStatus())
                        )
                    );
                }
            }
        }
    }

    public StatusEnum action(boolean condition1, boolean condition2,
        StatusEnum sourceStatus, EventEnum event) {
        initFSMMapIfNeed();
        FSMKey key = FSMKey.builder()
            .conditon1(conditon1)
            .conditon2(conditon2)
            .sourceStatus(sourceStatus)
            .event(event)
            .build();
        FSMValue fsmValue = fsmMap.get(key);
        if (fsmValue == null || fsmValue.getTargetStatus() == null) {
            //throw exception;
        }
        return fsmValue.getTargetStatus();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
变长指令周期是指在计算机指令执行过程中,不同指令所需要的周期长度可能不同。时序发生器FSM(Finite State Machine)设计是一种用于控制时序的方法。 在设计变长指令周期的时序发生器FSM时,首先需要确定指令执行的各个阶段,并给每个阶段分配一个时钟周期。这些阶段可以包括指令获取、指令解码、操作数准备、运算、结果存储等。不同指令所需的时钟周期数会根据指令的复杂性和执行过程中所需的操作不同而有所不同。 设计时序发生器FSM时,可以采用状态机(State Machine)的概念。状态机可以用状态和状态之间的转换来表示指令执行的不同阶段。根据指令的特性,可以将不同指令识别为不同的状态,然后根据指令的不同要求和执行过程的需要,确定状态之间的转换条件和转换逻辑。 在设计时需要考虑的是,如何根据指令的类型和执行过程的要求,灵活地控制时序发生器FSM的状态转换。可以使用逻辑电路或程序设计来实现这些状态转换逻辑。通过合理地设计状态和转换条件,可以满足不同指令的执行需求,使得变长指令周期得以实现。 总的来说,变长指令周期的时序发生器FSM设计需要确定指令执行的各个阶段和时钟周期,并采用状态机的概念来表示不同指令的不同阶段。根据指令的要求和执行过程的需要,通过逻辑电路或程序设计,灵活地控制时序发生器FSM的状态转换,实现变长指令周期的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值