单片机工控通常有延时,电机状态,传感器状态等通用耗时操作,业务程序查询这些状态,就会产生大量的冗余代码,不简洁.使用事件则是把这些通用操作丢给系统去处理,系统操作完成后,则运行业务程序的下一个Step.
** 延时不使用事件**
switch(step)
{
case STEP1:
baseTime = systemTime;
step= STEP2;
break;
case STEP2:
if(systemTime>(baseTime+500))
{
..
}
break;
}
延时使用事件:
switch(step)
{
case STEP1:
WaitTime(500,STEP2); //向系统请求延时500ms,让出程序运行权限,500ms后运行到STEP2
break;
case STEP2:
break;
}
不使用事件查询传感器状态
switch(step)
{
case STEP1:
if(IsSensorOn(X01))
{
StopSM(SM101);
}
break;
}
使用事件的查询传感器状态
switch(step)
{
case STEP1:
//向系统请求查询传感器X101,传感器感应后跳到STEP2
WaitSensorOn(X101,STEP2);
break;
}
不使用事件的电机运动
switch(step)
{
case STEP1:
RunSM(SM101,2000); //SM101运行2000步
step = STEP2;
break;
case STEP2:
if(IsSMStop(SM101))
{
}
}
使用事件的电机运动
switch(step)
{
case STEP1:
RunSM(SM101,2000);
//请求系统查询电机状态
WaitSM(SM101,STEP2);
break;
}
没有使用事件的找传感器的电机运动
switch(step)
{
case STEP1:
RunSM(SM101,2000);
step = STEP2;
break;
case STEP2:
if(IsSensorOn(X101))
{
StopSM(SM101);
return 1;
}
else if(IsSMStop(SM101))
{
return -1;
}
}
使用事件的找传感器电机运动
switch(step)
{
case STEP1:
//电机运动2000步,请求传感器状态 电机事件
FindSensor(SM101,2000,X101,STEP2,STEP_ERROR);
break;
case STEP2:
SetActionOk();
break;
case STEP_ERROR:
SetError("SM101电机丢步-SM101/X101");
break;
}
从上面的案例可以看出使用事件的程序几乎没有if else 程序更加口语化.事件实现的基本原理为:
//切换到事件处理函数
CurrentAction->ActionCallback = CurrentAction->EventCallback;
//系统循环
while(CurrentAction!=NULL)
{
CurrentAction->ActionCallback();
DelFinishAction();
CurrentAction = CurrentAction->NextAction;
}
//切回业务App
ThisAction->nStep = nStep;
ThisAction->ActionCallback = ThisAction->AppCallBack
全部0条评论
快来发表一下你的评论吧 !