简单状态机实现

来源:互联网 发布:淘宝仓库招聘 编辑:程序博客网 时间:2024/06/11 01:43
代码如下,是ansi c编写的demo。
这个简单的状态机使用c语言函数指针实现,可以支持状态转换、状态超时。

 
#include <time.h>
#include <stdio.h>
 
void delay_ms(int ms)
{
    //系统延时函数
}
 
unsigned int systemMs(void)
{
    clock_t c = clock()+100;
    return c;
}
 
/************ 状态机 BEGIN *****************/
typedef void (*state_func_t)(void);
static unsigned int g_state_timeout_milliseconds=0;
static state_func_t g_state_func = NULL;
 
void main_setNextState(state_func_t func)
{
    /*
     * g_state_timeout_milliseconds
     * 可以用于判断是否进入一个新状态;
     * 还可以用于判断进入某个状态多长时间了。
     */
    g_state_timeout_milliseconds = 0;
 
    g_state_func = func;
}
state_func_t main_getNextState(void)
{
    return g_state_func;
}
/************ 状态机 END *****************/
 
/************ 状态函数 BEGIN *************/
void main_state1(void);
void main_state2(void);
 
void main_state1(void)
{
    if(0 == g_state_timeout_milliseconds) {
        g_state_timeout_milliseconds = systemMs();
        printf("enter state1\n");
    }
 
    if(systemMs() - g_state_timeout_milliseconds > 5*1000) {
        printf("exit state1\n");
        main_setNextState(main_state2);
        return;
    }
 
    /*
     * TODO 这里实现业务逻辑
     * 比如到达某种条件,进入其他状态
     * 比如收到某条消息,进入其他状态
     */
}
void main_state2(void)
{
    if(0 == g_state_timeout_milliseconds) {
        g_state_timeout_milliseconds = systemMs();
        printf("enter state2\n");
    }
    if(systemMs() - g_state_timeout_milliseconds > 2*1000) {
        printf("exit state2\n");
        main_setNextState(main_state1);
        return;
    }
 
    /*
     * TODO 这里实现业务逻辑
     * 比如到达某种条件,进入其他状态
     * 比如收到某条消息,进入其他状态
     */
}
/************ 状态函数 END *************/
 
int main(int argc, char *argv[])
{
    printf("Hello, state machine!\n");
    /*
     * 设置初始状态
     */
    main_setNextState(main_state1);
 
    /*
     * 状态驱动
     * 每一个状态,处理完自己的事情后,负责指定下一个状态(使用main_setNextState函数)
     */
    while(1) {
        (*main_getNextState())();
        delay_ms(1);
    }
    return 0;
}
0 0