微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > switch状态机

switch状态机

时间:10-02 整理:3721RD 点击:
   当程序出现多个状态的时候,不能避免的会用到状态机这个东西,今天就说一下最简单的的switch状态机。通过switch,case来实现不同状态间的切换。以下是我总结的两种不同的结构:(c语言版)
在状态中判断事件:
cur_state=nex_state;
cur_state=nex_state;
switch(cur_state)
{
    case s0://s0状态
    {
           if(event0)
           {
                    //如果发生event0,则执行相关操作,执行完后,切换状态
                    nex_state=s0;//切换状态
            }
           else if(event1)
           {
                 //如果发生event1,则执行相关操作,执行完成后,切换状态
                     nex_state=s1;//切换状态
             }
          else if(event2)
          {
              //如果发生event2,则执行相关操作,执行完成之后,切换状态
                  nex_state=s2;
           }
        break;
     }
         case s1:
        if(event2)
                {
                        //如果发生event2,则执行相关操作,执行完成之后,切换状态
                        nex_state=s2;
                }       
                break;
        case s2:
            if(event0)
                {
                        //如果发生event0,则执行相关操作,执行完后,切换状态
                        nex_state=s0;
                }
                break;
}
第二种:在事件中判断状态
//event0事件发生时,执行的函数
void event0_function(int * nxt_state)
{
    int cur_state;
    cur_state = *nxt_state;
    switch(cur_state)
   {
        case s0:                 
        case s2:
            //执行相关操作
            *nxt_state = s0;
    }
}
//event1事件发生时,执行的函数
void event1_function(int * nxt_state)
{
    int cur_state;
    cur_state = *nxt_state;
    switch(cur_state)
    {
        case s0:                     
            //执行相关操作
            *nxt_state = s1;
    }
}
//event2事件发生时,执行的函数
void event2_function(int * nxt_state)
{
    int cur_state;   
    cur_state = *nxt_state;
    switch(cur_state)
    {
        case s0:                     
        case s1:
            //执行相关操作
            *nxt_state = s2;
    }
}
这两种写法的所实现的功能是相同的,开始的时候我喜欢用第一种写法,也就是在状态中判断事件,因为这样比较符合逻辑,顺序执行下来就可以,而且用这个来写协议解析的时候很是顺手,大家可以试试。
但是,后来发现这种写法有一个缺陷,就是这种顺序执行方式,排在前面的事件判断毫无疑问的优先于排在后面的事件判断,这种if、else写法破坏了事件之间原有的关系。
所以建议大家用第二种写法,在事件中判断状态。

顶一下,状态机,不错哦

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top