有限状态机的两种C语言实现

有限状态机FSM在硬件控制和软件设计中广泛应用,本文介绍了两种C语言实现方式:switch-break结构和二维状态表结合函数指针,分别解析了它们的优缺点和适用场景。
摘要由CSDN通过智能技术生成

有限状态机

**有限状态机FSM(Finite State Machine)**思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM–有限消息机)。

它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,依据判断进入下一个状态,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。


有限状态机的思想为我们编写状态较为复杂的程序提供了很方便的解决方案。例如通过代码来反应小车的运动,首先小车启动是一个加速的状态,然后小车匀速运动一段距离是一个匀速的状态,最后小车停下来又是一个减速的状态。这就可以将这三个状态反应到代码上:

enum
{
	WATING,				//等待启动		
	STRAT,				//启动
	CONSTANT,			//匀速
	BRAKE,				//刹车		
}CarState = WATING;		//初始状态为启动

STATE_UPDATE()
{
	switch(CarState)
	{
		case WATING:
			if(收到启动指令)
			{
				CarState = START;
			}
			break;
		case START:
			velocity += delt_vel;
			if(velocity == 匀速行驶的速度)
			{
				CarState = CONSTANT;	
			}
			break;
		case CONSTANT:
			distance += delt_distance;
			if(distanc
#include int main() { int state_key = 1; //钥匙状态 为1时钥匙区有钥匙,为时钥匙区 无钥匙 int state_hold = 0; // 钥匙持有状态 为1时持有钥匙,为时 未持有钥匙 int state_door = 0; //门状态 0:关闭 1:打开 int state_lock = 1; //上锁状态 1:上锁 0:解锁 int order; // 用于存放用户输入指令 printf("this is a game.\n"); printf ("if you want to OPEN THE DOOR ,input 1\n"); printf ("if you want to CLOSE THE DOOR ,input 2\n"); printf ("if you want to LOCK THE DOOR ,input 3\n"); printf ("if you want to UNLOCK THE DOOR,input 4\n"); // printf ("if you want to LOCK THE DOOR ,input 5\n"); printf("please input the order\n"); while(1) { scanf("%d",&order); // if(order!=(1||2||3||4)) // { // printf("worng input ,please input again.\n"); // continue; // } switch(order) { case 1 : if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=1; break; case 2: if(state_door==0) { printf("the door has been closed before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=0; break; case 3: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_lock=1; break ; case 4: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==0) { printf("the door has not been lock\n"); break; } state_lock=0; break ; } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值