state machine

以摄像头采集图像为例,编写代码步奏如下:

(第一种)
(1)//定义图像采集状态
typedef enum   //枚举具摄像头采集图像功能
{
  IMG_NOINIT = 0, //not start
  IMG_START,      //start to gather image
  IMG_GATHER,     //gathering image
  IMG_FINISH,     //finish
}ImgState_t;

ImgState_t imgstate = IMG_NOINIT;
//编写对应的处理函数
(2)void img_del (int imgstate)
{
  switch (imgstate )
  {
    case IMG_NOINIT:
      //调用初始化函数
    break;
    case IMG_START:
      //调用图像采集函数
    break;
    case IMG_GATHER:
      //调用读取,收集等函数
    break;
       //省略其他动作...
     default:
     break;
  }
}
(第二种)
采用函数指针数组的方式来实现:
typedef void ( * imgfunc_t)(void);  //定义函数指针类型
imgfunc_t imgfuncarray[4] = { img_init, img_start, img_gather, img_finish}; 
                           //数组每一项位函数名
//图像采集动作函数
void img_init (void)
{
  //...
}
//...
/*!处理函数*/
void img_deal (int imgstate)
{
   (* imgfuncarray [imgstate] )();  //查表,执行响应的函数;速度由于switch
}

ImgState_t img_state =  IMG_NOINIT;
int main()
{
  //start gather image
  img_state = IMG_START;
  //开启中断
  ...
  img_deal (img_state); //开始采集
  ...
}

(4)条件与状态的改变
初始化默认为:IMG_NOINIT.
在main函数里,档处理完图像数据,需要采集图像的时候,把状态设为IMG_START,使能长中断,
等待中断到来,当发生中断时,把状态标记为IMG_GATHER, 开始采集图像。采集完图像后,
把状态标记为IMG_FINISH,禁止中断。
在main函数里等待图像采集完成后,对图像进行处理,然后仍然把状态设为IMG_START,
使能中断,开始采集图像。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值