美文网首页
利用状态机来遍历FLASH取出指定数据

利用状态机来遍历FLASH取出指定数据

作者: EVE0430 | 来源:发表于2018-01-31 17:02 被阅读0次

    参考资料:
    http://blog.csdn.net/v__king__/article/details/71740492 [状态机实现的三种方法-C语言]
    http://blog.csdn.net/findaway123/article/details/16870927有限状态机在程序设计中作用和意义

    为什么要用状态机,状态机常用于哪里

    1.过多的if else带来结构的过于复杂
    2.改变传统的'遵循事先设定的逻辑,从头到尾地执行',可以处理任何顺序的事件,并能提供有意义的响应——即使这些事件发生的顺序和预计的不同。有限状态机正是为了满足这方面的要求而设计的。
    3.各种通信协议发送方和接受方传递数据时,一个字节一个字节接收比对(下例类似)
    4.自底向上解析语法的parser
    5.饮料机(数电课本)
    6.正则中关键字过滤,可以用有限自动机推导正则表达式

    说了这么多,看看实例吧
    实例:从FLAG中取出想要的那一帧数据

    void found()
    {  unsigned char myptr=0;
     int mypage=256;
     unsigned char i =0;
     unsigned char my_tx_buffer[170];
     unsigned char want_day[6];//年
     unsigned char address[6];
     unsigned char cur_state=0;
     unsigned char nxt_state=0;
       for(unsigned i=0;i<170;i++)
         my_tx_buffer[i]=0;
     //如果我要找2018年1月31日12点24分24秒的信息  
         want_day[0]=0x19;
         want_day[1]=0x01;
         want_day[2]=0x31;
         want_day[3]=0x12;
         want_day[4]=0x24;
         want_day[5]=0x24;
         //
         mypage=256;  //数据存于256页至1024页
         while(1)
      {   
            ReadMemory(address,6,mypage,myptr);  //于mypage页myptr字节处读取至address
            cur_state = nxt_state;   
     switch(cur_state) //状态0,刚进入查询
         {            
           case 0: //在s0状态   
           if(address[0]==want_day[0]) //如果年份一样,那么就执行a1动作,并将状态转移到s1态; 
           { nxt_state = 1; }
             else
             break; 
          case 1: //在s1状态
           if(address[1]==want_day[1]) //如果月份符合 
           { nxt_state = 2; }           
            else
              break;       
          case 2: //在s2状态
           if(address[2]==want_day[2]) //如果日符合            
           {nxt_state = 3;}     
           else
             break;
           
           case 3: //在s3状态  符合数据 取出并保存
           for( i=0;i<6;i++)
             my_tx_buffer[i]=address[i];
             nxt_state = 0 ;
             goto solve;
           
           default:break;
    }
    myptr+=73;
    if(myptr>73)
    {myptr=0;
    mypage++;
    }   
    if(mypage>1024)
    {
     mypage=256;
     goto solve;
    }
    }   
    solve:  //后续处理     
    
         myptr=0;
    
    }
    

    相关文章

      网友评论

          本文标题:利用状态机来遍历FLASH取出指定数据

          本文链接:https://www.haomeiwen.com/subject/dtrlzxtx.html