解决程序堵塞的优化方法(二)

    本文链接上篇继续叙述,如果没有看到看一篇的,大家可以点击传送门观看。

总述       

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;   
​
}

今天需要早点睡,明天早上补起来,先占个时间。

发布了20 篇原创文章 · 获赞 20 · 访问量 2635

猜你喜欢

转载自blog.csdn.net/lyn631579741/article/details/104469426