dufaxing To be a better man

状态机思想



有限状态机,简写为FSM(Finite State Machine),主要分为两大类:第1类,若输出只和状态有关而于输入无关,则称为Moore状态机;第2类,输出不仅和状态有关而且和输入有关,则称为Mealy状态机。

状态机的概念

状态机可归纳为4个要素,即线态,条件,动作,次态。

  • 现态:是指当前所处的状态。
  • 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
  • 动作:条件满足后执行的动作。动作完毕后,可以迁移到新的状态,也可以依旧保持原状态。
  • 次态:条件满足后要迁往新的状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变了新的“现态”了。

以摄像头采集图像为例。

响应的处理函数

switch处理状态机

typedef enum {
  IMG_NOTINIT = 0,
  IMG_FINISH,
  IMG_GATHER,
  IMG_START,
}
void img_deal(int imgstate)
{
  switch(imgstate) {
    case IMG_NOTINIT:
    //初始化动作
    break;
    case IMG_START:
    //启动图像采集动作
    break;
    //···
    //其他动作
    //···
    default:
    break;
  }
}

如果状态较多,使用switch会影响速度。

利用函数指针数组

void img_init(void){}
void img_start(void){}
void img_collet(void){}
void img_finish(void){}

typedef void (* imgfunc)(void);
imgfunc imgfuncarry[4] = {img_init,img_start,img_collet,img_finish};

void img_deal(int i)
{
  (* imgfuncarry[i])();//查状态表,执行响应的函数,速度优于switch
}

int main(void)
{
  img_deal(2);//执行img_collet()函数
  return 0;
}


下一篇 Notepad++设置

Comments

Content