本文链接上篇继续叙述,如果没有看到看一篇的,大家可以点击传送门观看。
总述
1.通过运用RTOS,线程里面调用系统提供的延时等函数,实现解决阻塞。
2.全局变量方法,定时器计数条件判断替代延时。
3.使用状态机方式,分解动作,替代延时实现。
4.使用链表式,与第三种相似。
三、 状态机法
状态机执行与全局变量的区别在于,状态机的方法是更进一层的定时操作,可以通过状态机在主循环或者触发函数实现多个动作的延时操作。
状态机中大致会分为两类延时替代操作,一种注重多个动作的延时,一种叫精确时间的延时。第一种情况经常会在一些需要双方有来有往的应答操作出现,而后一种出现在明确延时操作过程中。接下来我们展示一下代码风格吧。
1.注重动作的状态机
/*堵塞型的代码*/
void clogged(void)
{
taskfun1();
delay(500);
taskfun2();
delay(100);
taskfun3();
delay(20);
}
/*注重分解动作的状态机*/
void TIM_IRQ(void)/*定时器中断服务函数*/
{
FSMtimer ++;/*设置合适的中断时间间隔*/
}
static u32 FSMtimer = 0,LastFSMtimer = 0;/*用来计时变量*/
static u8 FSMSta = 0;/*设置状态的工作步骤的变量*/
void actionFSM(void)
{
switch(FSMSta)
{
case 0:
taskfun1();
FSMSta = 1;
break;
case 1:
taskfun2();
FSMSta = 2;
break;
case 2:
taskfun3();
FSMSta = 3;
break;
case 3:
if(FSMtimer - LastFSMtimer >100 )/*定时判断完成任务*/
{
taskfun4();
FSMSta = 4;
}
else
{
taskfun5();
FSMSta = 1;/*条件判断出现问题,实现动作跳转,进行动作重复*/
}
break;
case 4:
taskidle();/*状态机的状态执行完成可以进行空闲任务*/
break;
}
今天需要早点睡,明天早上补起来,先占个时间。