有限状态机编程FSM

本文探讨了在使用iTRON类OS的嵌入式系统中,如何利用状态机作为主要设计方法。重点讲述了通过状态机处理消息的模型,包括事件和消息的处理方式,并给出一个简单的机器人状态机实现示例,强调了状态机设计过程中的关键原则。

一个改进的状态机编程应用

//程序来源:http://blog.csdn.net/jiankangshiye/article/details/8725017
//修改如下:
//使用函数指针实现的基于状态机(FSM)的密码锁  
//只有正确输入密码 2479 才能解锁   
#include <stdio.h>    
//这个秘密锁的密码是xxxx2479,就是说最后4位是2479,前面若干为为0~9里的数字,也可没有   
#include <stdlib.h>    
#include <string.h>     
  
//定义锁事件处理函数的函数指针类型  
typedef void (*(*lock_func)( char ))( char ); //可以使用typedef让声明简化
//typedef void (*lock_func_temp)(char c);  
//typedef lock_func_temp (*lock_func)(char c);  


lock_func state;  
  
//函数声明队列   
//列出来,交叉引用才不会报错   
//所有函数必须接受同样的参数,并返回同种类型的返回值
lock_func init_state(char ch);  
lock_func state1(char ch);  
lock_func state2(char ch);  
lock_func state3(char ch);  
lock_func state4(char ch);  
  
//初始状态   
lock_func init_state(char ch)  
{  
    if ((ch < '0') || (ch > '9'))  
    {
printf( "invaild number!\n" );
        return (lock_func)init_state;
    }
    else  
        return (lock_func)state1(ch); //这里还必须得有参数,不然就会漏处理一个字符   
}  
  
//状态1   
lock_func state1(char ch)  
{  
    if (ch == '2')  
    {  
        return (lock_func)state2;        
    } else   
    {  
printf( "error!\n" );
        return (lock_func)init_state;  
    }  
}  
  
//状态2   
lock_func state2(char ch)  
{  
    if (ch == '4')  
    {  
        return (lock_func)state3;        
    } else   
    {  
printf( "error!\n" );
        return (lock_func)init_state;  
    }     
}  
  
//状态3   
lock_func state3(char ch)  
{  
    if (ch == '7')  
    {  
        return (lock_func)state4;        
    } else   
    {  
printf( "error!\n" );
        return (lock_func)init_state;  
    }  
}  
  
//状态4   
lock_func state4(char ch)  
{  
    if (ch == '9')  
    {  
        printf("Correct, lock is open!\n");   
        return NULL;          
    } else   
    {  
printf( "error!\n" );
        return (lock_func)init_state;  
    }  
}  
  
//结束状态是NULL  
//就是通过 return NULL;表达的结束状态.   
   
//状态转换在这里   
void lock_handle (void)  
{  
    char ch;  
    state = (lock_func)init_state;  
    while (state)  
    {  
        ch = getchar();  
        state = (lock_func)(*state)(ch);  
    }  
}   
  
   
i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值