状态机

基本概念

状态机全称为有限状态自动机(Finite State Machine)。给定一个状态机,同时给定它的当前状态以及输入,那么输出状态时可以明确地运算出来。

四大概念

概念 说明
State 状态,一个状态机至少要包含两个状态
Event 事件,执行某个操作的触发条件或口令
Action 动作,事件发生以后要执行的动作,一般对应一个函数
Transition 变换,从一个状态变化为另一个状态,也称作次态

事件驱动型编程

  • 状态机编程又称事件驱动型编程
  • 通过外部接口恰当的更改状态量,线程内部循环根据状态量完成对应过程
  • 依赖于通过使用静态变量维护执行上下文

监护条件

监护条件是基于扩展状态变量和事件参数动态评估的布尔表达式,当监护条件仅在表达式为真时才允许动作转换。

事件与动作

  • 事件:系统中发生的事情,是状态变化的助推剂
  • 动作:当事件发生时,状态机执行相应动作进行响应
  • 一个事件可能触发多个不同转换,状态机根据事件性质和对状态的反应进行编码

运行-到-完成(RTC)

  • RTC表示一个状态机能在开始处理下一个事件前完成对每个事件的处理
  • 新到的事件不能中断当前事件的处理
  • 使用事件队列存储状态机忙碌时到达的事件

层次式嵌套状态

  • 层次式状态机有分层的概念
  • 当底层状态没有能处理该事件时,交付给上层状态机处理
  • 子状态只需定义与超状态的不同部分
  • 可以重用超状态的公共行为

进入和退出动作

  • 进入和退出动作提供可担保的初始化和清理方法

内部转换 vs 本地转换

  • 内部转换:事件造成动作被执行但不导致状态改变,不执行进入和退出动作
  • 本地转换:当主目标状态是主源的子状态或超状态时,不会导致退出和重新进入

事件延迟

当处于某个状态中而不能处理某个事件时,事件的处理可以被延迟,直到系统进入另一个状态。

状态机实现步骤

  1. 定义状态接口
  2. 定义系统当前状态指针
  3. 定义具体状态,根据状态迁移图实现功能和状态切换
  4. 定义主程序上下文操作接口
  5. 初始化系统当前状态指针
  6. 主程序通过上下文操作接口控制系统当前状态的变化

信号粒度

  • 重复使用相同方法处理相同信号 → 信号粒度过分精细,导致处理函数膨胀
  • 频繁使用监护条件测试事件参数 → 信号粒度太粗略