单片机中的阻塞延时与非阻塞延时:比较与实践
一.延时函数的定义
1.个人理解:通过执行一些无意义的指令,来达到拖延运行下一条指令时间的函数。
二.阻塞延时函数
1.独占性的延时函数,其在运行时,整个系统都将处于停滞的状态。不利于多任务并行,因为用阻塞延时函数的话,因为某一个任务的延时需求,而导致所有的任务都只能眼巴巴的看着,对单片机资源造成极大的浪费,同时也不利于项目的稳定实时运行。
2.例子:
void delay(unsigned int ms) { unsigned int i,j; for(i=ms;i>0;i--) { for(j=124;j>0;j--); } }
此时调用这个函数时,整个单片机都会等着这个函数时间耗完才继续执行。
关键条件指令:for函数
三.非阻塞延时
1.非独立性的延时函数,与阻塞函数相反,不会将整个系统都拉入停滞状态。
2.例子:
#define DELAY_TIME 5000 unsigned int u16_led_cnt; unsigned int u8_led_delay_flag; int main( ) { u16_led_cnt=DELAY_TIME; while(1) { if(u16_led_cnt) { u16_led_cnt--; if(!u16_led_cnt) { u8_led_delay_flag=1; } } if(u8_led_delay_flag==1) { u8_led_delay_flag=0; u16_led_cnt=DELAY_TIME; task(....); } } }
靠while(1)大循环,每次都执行一次就出去了,不会阻塞系统其他任务运行
关键条件指令:while,if
3.缺点:
其实非阻塞函数这样操作是非常不精确的,因为while(1)是整个大循环,大循环内任务越多,单次运行时间就越长,基本时基越来越大,这样造成了延时的时间不稳定。
那么我们如何进行均匀,精确的非阻塞延时呢?
答案:定时器,借助硬件定时器来定义出多个软件定时器来满足各个不同任务延时的需求。
下次更新再来一起学习。