You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C转DML开发:如何将交通灯状态机C代码移植为可Checkpointable的DML实现?

交通灯状态机的现代DML实现(支持Checkpointable)

以下是针对你提供的C语言交通灯状态机的DML移植版本,充分利用了DML的原生状态机特性,并实现了Checkpointable功能:

module traffic_light;

import dml.base;
import dml.timer;

// 可配置的时间参数,标记为checkpoint以支持持久化
parameter int red_time_ms = 15000 checkpoint;
parameter int green_time_ms = 10000 checkpoint;
parameter int transition_time_ms = 1000 checkpoint;

// 交通灯状态枚举,标记为checkpoint
enum TrafficLightState {
    RED,
    YELLOW,
    GREEN
} checkpoint;

// 状态机实例与定时器,均标记为checkpoint以支持持久化
state_machine TrafficLightState current_state checkpoint;
timer transition_timer checkpoint;

// 红灯状态逻辑
state current_state.RED {
    on entry {
        // 进入红灯时启动定时器,到期后切换到黄灯
        transition_timer.start(red_time_ms);
    }

    on transition_timer.timeout {
        current_state.transition(YELLOW);
    }
}

// 黄灯状态逻辑
state current_state.YELLOW {
    on entry {
        // 进入黄灯时启动过渡定时器
        transition_timer.start(transition_time_ms);
    }

    on transition_timer.timeout {
        // 根据上一个状态决定下一个目标状态
        if (current_state.previous == RED) {
            current_state.transition(GREEN);
        } else if (current_state.previous == GREEN) {
            current_state.transition(RED);
        }
    }
}

// 绿灯状态逻辑
state current_state.GREEN {
    on entry {
        // 进入绿灯时启动定时器,到期后切换到黄灯
        transition_timer.start(green_time_ms);
    }

    on transition_timer.timeout {
        current_state.transition(YELLOW);
    }
}

// 模块初始化:初始化为红灯状态
on init {
    current_state.initial(RED);
}

实现说明

  1. 原生状态机特性

    • 使用DML内置的state_machine类型定义状态机,每个状态的逻辑封装在独立的state块中,替代了C风格的switch-case结构,代码结构更清晰、可读性更强。
    • 通过on entry处理状态进入时的动作,on [timer].timeout处理定时器触发事件,无需手动注册回调函数。
  2. Checkpointable支持

    • 所有需要持久化的变量(状态枚举、状态机实例、定时器、时间参数)都添加了checkpoint修饰符,DML会自动在checkpoint操作时保存这些变量的状态,恢复时能完全还原运行状态。
    • 定时器的剩余时间会被自动纳入checkpoint范围,无需手动处理定时器状态的保存与恢复。
  3. 逻辑简化

    • 状态转换逻辑直接绑定到状态的事件处理中,避免了C版本中多个回调函数交叉处理状态的混乱。
    • 利用current_state.previous获取上一个状态,简洁实现黄灯的双向过渡逻辑。

内容的提问来源于stack exchange,提问作者Gustav Wiklander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:01:01