while(1);//这就是阻塞语句
while(flag);//这还是阻塞语句
int main()
{
while(1)
{
if(flag==1){do_something_1();flag=2;}
if(flag==2){do_something_2();flag=4;}
if(flag==3){do_something_3();flag=5;}
if(flag==4){do_something_4();flag=0;}
if(flag==5){do_something_5();flag=6;}
if(flag==6){do_something_6();flag=0;}
}
}
//类似上面这样,在中断里i就设置flag的值就好了,设置完就退出中断,由于flag初始为0,上面的所有语句都不执行,知道flag=1,才开始依次执行1-2-4,然后flag回到0。
//还有,某些时候我们看到delay延时函数是用for(;i>0;i--);这样的方式实现的。其实是让单片机空跑N个循环,虽然单片机在空跑,但是CPU资源依旧被占用着不能执行其他的任务。如果把这部分时间拿出来好好利用好,也可以提高多任务执行的效果。
举例说一下:
还是上面的状态机,我们看到flag的执行顺序是1-2-4-0,假定只有1-4两个任务,中间是需要延时1秒。那么我们可以这么做:
1.设置一个定时器中断,中断周期1ms,中断服务里写if(delay>0)delay--;这里的delay是一个全局无符号整形变量。
2.
if(flag==1){do_something_1();delay=1000;flag=2;}
if(flag==2){do_something_2();}
do_something_2()
{
if(!delay)flag=4;
}
delay会从1000往下减,每1ms减1,知道0的时候符合flag==2且!delay=true条件,flag=4跳转到下面的语句。在这之前flag=2,且if(flag==2)的语句很快就执行完,不会耽误CPU执行其他的任务(例如if(flag2==1)之类的)
|