您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
业务架构设计
4月18-19日 在线直播
基于UML和EA进行系统分析设计
4月25-26日 北京+在线
AI 智能化软件测试方法与实践
5月23-24日 上海+在线
     
   
 
 订阅
有限状态机的范型实现
 
作者:lilipublic
   次浏览      
 2007-6-7
 
编辑推荐:
本文介主要用一个示例介绍如何用自动机来塑造一个简单的装置,希望对您的学习有所帮助。
本文来自gameres,由火龙果软件Linda编辑、推荐。

有限状态自动机(finite state automata)或有限状态机(finite state machine),是一个简单的数学模式,具有离散式输入的有限集合,与通过一个根据被接受到输入的次序所决定的有限状态集合。自动机可能具有一个有限集合的输出。如果是这样,则自动机将会产生一连串的输出以反映出一连串的输入。换币机、升降机、自动贩卖机,与车库开门器是根据模型的机器的例子。在计算器科学的许多领域中,有限状态是非常有用的设计模型,包括编译器中的语汇扫瞄,以计算协议之定义,与交换电路。

下面说明了如何用自动机来塑造一个简单的装置。下图说明对于车库开门器操作情形的一个状态模型,以标记图或状态图表示出。假设由两个按钮来控制门:一个称为开扭而另一个称为关扭。门的四个状态以圆圈表示记为关闭、上升、下降及打开。此描述了车库之门操作的情形。


车库开门器的状态模型

当门是在关闭状态,按开钮会使得门进入上升状态,于此期间在马达控制之下,门将逐渐的开启。在门完全打开之后,即进入关闭状态。再按关钮会使门进入下降状态,于此期间门将逐渐的关闭。从状态途中可以清楚的看出门不能立即地从打开状态至关闭状态,反过来亦如此。而且,也可能轮流的按开钮与关扭,使门在上升与下降状态之间转变,使得门的动作像玩偶一样。最后,此模型说明当门是在关闭状态时按关钮或者门是在打开状态时按开钮,将不会引起任何状态的改变,所以什么事情都不会发生。在马达控制门时会侦测『完全关闭』以及『完全打开』之事件,以分离按钮的机械装置。

当门是在某一特殊状态时,我们可将有限状态自动机的输出想成送给马达控制用的控制信号。在其它的情况下,则没有可确认的输出。我们只感兴趣于机器对一连串输入的反应所产生的状态。对于自动机的研究我们将分为具有输出的自动机与不具输出的自动机。

现在我们正式地介绍有限状态机的抽象模式。有限状态是由下列各项规则所决定的:

  1. 状态有限集S={S0,S1,S2, ...... }。
  2. 集合S的特殊元素S0,即为起始状态(initail state)。
  3. 输入字母有限集I={i1,i2, ...... }。
  4. 输出字母有限集O={o1,o2, ...... }。
  5. S×I映至S的函数f,即转换函数(transition function)。
  6. S映至O的函数g,即为输出函数(output function)。

在任何时刻中,有限状态机皆处于某一状态中。当输入字母进入时,此机器则经由转换函数转换到另一状态中。而且,此机器依据输出函数而造出一个输出字母。如表二所示的列表方式能够很方便地描述有限状态机。对于表二所示的有限状态机而言,其集合为{S0,S1,S2,S3,S4,S5,S6},其输入字母集为{a,b,c},而输出字母集为{0,1}。在S0上的双线箭头表示S0为起始状态。在表二(a)中,列有转换函数f,其中在一列(对应于状态Sp)与一行(对应于输入字母之q)交点上的状态即为f(Sp,ip)的值。表二(b)中列有输出函数。

范型实现

 

/*
	 * 抽象有限状态机模板
	 * 四个规则:
	 *  1.状态有限集合S={S0,S1,S2, ...... }。
	 *	2.集合S的特殊元素S0,即为初始状态(initail state)。
	 *	3.输入有限集I={i1,i2, ...... }。
	 *	4.输出有限集O={o1,o2, ...... }。
	 */
	template <class StateType,class InputType,class OutputType>
	class FSM
	{
	public:
		//构造函数
		FSM(const set<StateType>& States,//状态有限集合S={S0,S1,S2, ...... }。
			const set<InputType>& Inputs,//输入有限集I={i1,i2, ...... }。
			const set<OutputType>& Outputs,//输出有限集O={o1,o2, ...... }。
			const StateType& InitState)://集合S的特殊元素S0,即为初始状态(initail state)
				m_States(States),m_Inputs(Inputs),
				m_Outputs(Outputs),m_CurrentState(InitState)
		{
			assert(States.size()>0);
			assert(States.find(InitState)!=States.end());
		}
		
		//获取当前状态
		StateType CurrentState() const
		{
			return m_CurrentState;
		}
		//根据输入值改变状态,返回改变以后状态机的当前状态		
		StateType ChangeState(const InputType& Input)
		{
			m_CurrentState=Transition(Input);
			return Output(m_CurrentState);
		}		
		//状态有限集合S={S0,S1,S2, ...... }。
		const set<StateType> m_States;
		//输入有限集I={i1,i2, ...... }。
		const set<InputType> m_Inputs;
		//输出有限集O={o1,o2, ...... }。
		const set<OutputType> m_Outputs;		
		
	protected:
		//5.I映至S的函数f,即转换函数(transition function)。
		virtual StateType Transition(const InputType& Input) const=0;
		//6.S映至O的函数g,即为输出函数(output function)。
		virtual OutputType Output(const StateType& State) const=0;
		//析构函数
		virtual ~FSM(void)=0{}

private:
//当前状态
StateType m_CurrentState;


};

 

 

   
次浏览       
相关文章

一文了解汽车嵌入式AUTOSAR架构
嵌入式Linux系统移植的四大步骤
嵌入式中设计模式的艺术
嵌入式软件架构设计 模块化 & 分层设计
相关文档

企点嵌入式PHP的探索实践
ARM与STM简介
ARM架构详解
华为鸿蒙深度研究
相关课程

嵌入式C高质量编程
嵌入式操作系统组件及BSP裁剪与测试
基于VxWorks的嵌入式开发、调试与测试
嵌入式单元测试最佳实践

最新活动计划
业务架构设计与建模 4-18[北京]
DeepSeek大模型开发实践 4-19[在线]
基于 UML 和EA进行分析设计 4-26[北京]
产品经理与产品管理 5-8[上海]
AI智能化软件测试方法与实践 5-23[上海]
图数据库与知识图谱 5-22[北京]
 
 
最新文章
基于FPGA的异构计算在多媒体中的应用
深入Linux内核架构——简介与概述
Linux内核系统架构介绍
浅析嵌入式C优化技巧
进程间通信(IPC)介绍
最新课程
嵌入式Linux驱动开发
代码整洁之道-态度、技艺与习惯
嵌入式软件测试
嵌入式C高质量编程
嵌入式软件可靠性设计
成功案例
某军工所 嵌入式软件架构
中航工业某研究所 嵌入式软件开发指南
某轨道交通 嵌入式软件高级设计实践
深圳 嵌入式软件架构设计—高级实践
某企业 基于IPD的嵌入式软件开发
更多...