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); }
实现说明
原生状态机特性
- 使用DML内置的
state_machine类型定义状态机,每个状态的逻辑封装在独立的state块中,替代了C风格的switch-case结构,代码结构更清晰、可读性更强。 - 通过
on entry处理状态进入时的动作,on [timer].timeout处理定时器触发事件,无需手动注册回调函数。
- 使用DML内置的
Checkpointable支持
- 所有需要持久化的变量(状态枚举、状态机实例、定时器、时间参数)都添加了
checkpoint修饰符,DML会自动在checkpoint操作时保存这些变量的状态,恢复时能完全还原运行状态。 - 定时器的剩余时间会被自动纳入checkpoint范围,无需手动处理定时器状态的保存与恢复。
- 所有需要持久化的变量(状态枚举、状态机实例、定时器、时间参数)都添加了
逻辑简化
- 状态转换逻辑直接绑定到状态的事件处理中,避免了C版本中多个回调函数交叉处理状态的混乱。
- 利用
current_state.previous获取上一个状态,简洁实现黄灯的双向过渡逻辑。
内容的提问来源于stack exchange,提问作者Gustav Wiklander
相关产品推荐
相关产品推荐

