状态机编程 (一) 状态机相关概念

基本概念
状态机编程,又称事件驱动型编程。

事件驱动程序需要一系列的精细粒度的事件处理函数来处理事件。这些事件函数必须处理的很快并返回主事件循环。所以其非常依赖于通过使用静态变量维护在从一个事件驱动函数转换到下一个执行函数时的执行上下文。

大多数事件驱动型系统行为可以被分解为相对小数目的块,在每个单独的块的事件响应实际上取决于当前的事件类型。

行为的快被称为状态,行为的改变对应着状态的改变,称为状态装换。

状态机与流程图的区别在于,当状态机停在某个状态等待一个事件时,是空闲的;而流程图停留在某个节点时,忙于处理操作。

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

事件
事件是系统中发生的事情,是状态变化的助推剂。但是状态是否发生切换,还需要监护条件进行判断。所以一个状态对一个同样的触发可以有许多转换。状态机根据事件的性质和状态对这个事件的反应进行编码。

动作和转换
当一个事件发生时,状态机执行相应动作进行响应。

从一个状态切换到另一个状态,引发的事件成为触发事件。

运行-到-完成  RTC
RTC表示一个状态机能在它能开始处理下一个事件前完成对每个事件的处理。一个状态机在到达一个稳定的状态配置前不能接收事件。

在RTC模型里,系统在分散的不可分割的RTC步骤里处理事件,新到的事件不能中断当前事件的处理。因为状态机在动作的过程中没有处于一个明确定义的状态。所以状态机需要在一个稳定的状态配置中开始处理每一个事件。

解决方法是在一个状态机忙碌时使用事件队列存储事件。

但是RTC不意味着状态机必须独占CPU直到RTC步骤被完成,在一个多任务处理环境里,其他任务也可以运行,可能抢占当前执行的状态机。

RTC尽量小以快速响应事件。

层次式嵌套状态
层次式状态机有分层的概念,当底层的状态没有能处理该事件时,这个事件不会像传统的平面状态机一样被丢弃,而是交付给上层状态机进行处理。层次式状态机是一个理想的隐藏内部细节的机制。其威力在于用来排除可能会发送的重复。

层次分解的原则是,子状态仅需要定于与超状态的不同部分,一个子状态可以容易的通过忽略公共处理的事件,从而重用它的超状态的公共行为,然后这些公共行为自动的被高层的状态处理。

进入和退出动作
进入和退出动作的价值在于提供了可担保的初始化和清理方法。

内部转换
一个事件造成一些内部动作被执行但是又不导致一个状态的改变,称为内部转化。与自转换不同的是,执行内部转化的时候不会执行进入和退出动作。

本地转化
本地转化在主目标状态是主源的一个子状态时,并不会导致主源状态的退出。本地转换在主目标是主源状态的一个超状态时,不会导致退出和重新进入主目标。本地装换不会导致进入目的状态,外部转换会导致退出和重新进入到目标状态。

事件延迟
当处于某个状态中而不能处理这个事件的时候,事件的处理可以被延迟,直到系统进入另一个状态,在那里更好的准备去处理原来的这个事件。这实际上会改变提交给状态机的事件顺序。

信号粒度
如果你重复的使用相同的方法处理相同的信号,说明信号粒度过分精细,会导致处理函数膨胀。

如果你频繁的使用监护条件测试事件参数,表示信号粒度太粗略。
————————————————
版权声明:本文为CSDN博主「Chen_Hulk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010034085/article/details/119302460

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值