项目1-1 阻塞延时与非阻塞延时

非阻塞延时实现LED闪烁功能(累计主循环次数)

在这里插入图片描述

阻塞延时

void main()
{
	while(1){
	LED = 0;
	delay_xms(500);
	LED = 1;
	delay_xms(500);
    }
}

非阻塞延时

定义一个变量作为累计循环次数的计数(将for循环或者while循环改为判断的形式,便于后面的多任务处理。)

sbit LED0 = P1^0;

#define LED_DELAY_TIME 5000
unsigned int u16_led_cnt;
unsigned char u8_led_delay_flag
void main()
{
	U16_led_cnt = LED_DELAY_TIME;
	//依靠while(1)来计数
	while(1){
	if(U16_led_cnt)
	{
	u16_led_cnt--;//该变量会减5000次
	if(!u16_led_cnt){
  		u8_led_delay_flag = 1;
  	}
  	if(u8_led_delay_flag == 1)//代表时间到了
  	{
		//首先将标志清零,防止多次触发
		u8_led_delay_flag = 0;
		U16_led_cnt = LED_DELAY_TIME;
		LED0 = ~LED0;
	}
}
}
}

没有独占系统,他每次都是执行一次就出去了,并不像阻塞函数的for循环一直卡在循环里面。
实现不同灯闪烁不同时间,虽然两个任务差了微秒的量级,但是他们看着像同步运行,每次在while循环里面都是顺序执行。
例子:人只有一个大脑,但是可以边吃饭边看手机,感觉同时做两件事情
特点:我们要把每个大循环执行的延时任务分割开来,不要一次将延时执行完,而是每次执行一点点,但是借助while大循环可以多次执行,同样可以起到一个延时的目的。

sbit LED0 = P1^0;
sbit LED1 = P1^1;
#define LED0_DELAY_TIME 5000
#define LED1_DELAY_TIME 10 000

void main()
{
	unsigned int u16_led0_cnt;
	unsigned char u8_led0_delay_flag
	unsigned int u16_led1_cnt;
	unsigned char u8_led1_delay_flag
	
	U16_led0_cnt = LED0_DELAY_TIME;
	U16_led1_cnt = LED1_DELAY_TIME;
	//依靠while(1)来计数
	while(1){
	if(U16_led0_cnt)
	{
	u16_led0_cnt--;//该变量会减5000次
	if(!u16_led0_cnt){
  		u8_led0_delay_flag = 1;
  	}
  	if(u8_led0_delay_flag == 1)//代表时间到了
  	{
		//首先将标志清零,防止多次触发
		u8_led0_delay_flag = 0;
		U16_led0_cnt = LED0_DELAY_TIME;
		LED0 = ~LED0;
	}
	if(U16_led1_cnt)
	{
	u16_led1_cnt--;//该变量会减5000次
	if(!u16_led1_cnt){
  		u8_led1_delay_flag = 1;
  	}
  	if(u8_led1_delay_flag == 1)//代表时间到了
  	{
		//首先将标志清零,防止多次触发
		u8_led1_delay_flag = 0;
		U16_led1_cnt = LED1_DELAY_TIME;
		LED1 = ~LED1;
	}
}
}
}

总结

软件延时如直接用for或while循环实现延时的函数,他们是独占CPU的延时函数,当该软件延时启动的时候,CPU的其他任务无法执行,整个系统处于停止等待的状态,不利于多任务并行。此时我们可以实现一种非阻塞的延时,定义一个变量作为累计循环次数的计数,将for循环或者while循环改为判断的形式,每次执行一次就进行–操作,然后判断是否计数完成,然后跳出程序,进而执行其他任务函数。最终呈现的效果是一种多任务并行的效果,而不像阻塞函数的for循环一直卡在循环里面。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值