以摄像头采集图像为例,编写代码步奏如下:
(第一种)
(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,
使能中断,开始采集图像。