程序调用的几种方式

1、种类

(1)同步阻塞

(2)同步非阻塞

(3)异步阻塞

(4)异步非阻塞

2、类比烧一壶水的动作来理解。

●装上壶水,插上电,搬个小板凳坐等水烧开:同步阻塞式调用。

●装上壶水,插上电,然后去看电视,每5分钟跑过来看一下水烧开了没有:同步非阻塞式调用。

●装上壶水,插上电,躺在床上什么也不干,等水烧开水壶鸣笛后去倒水:异步阻塞式调用。

●装上壶水,插上电,然后去看电视,等水烧开水壶鸣笛后去倒水:异步非阻塞式调用。

3、通过点灯程序进行举例

(1)同步阻塞

int main(void)
{
	Init;
	while(1)
	{
		//delay
		for(uint16_t i=0;i<60000;i++)
		{
			nop;
		}
		led_toggle; //led翻转
		//delay
		for(uint16_t i=0;i<60000;i++)
		{
			nop;
		}
		led_toggle; //led翻转
	}
}

(2)同步非阻塞

Timer_IRQ(void)
{
	timer_count++;
}
int main(void)
{
	Timer_Init;
	while(1)
	{
		if(timer_count > 5000)
		{
			timer_count = 0;
			led_toggle; //led翻转
		}
		Do_Other_Things;
	}
}

(3)异步阻塞

//定时器中断相当于另一个线程
Timer_IRQ(void)
{
	if(timer_count++>5000)
	{
		timer_count = 0;
		timeout_flag=1;
	}
	
}
int main(void)
{
	Timer_Init;
	while(1)
	{
		while(timeout_flag== 1)
		{
			timeout_flag = 0;
			led_toggle; //led翻转
		}
	}
}

(4)异步非阻塞

Timer_IRQ(void)
{
	if(timer_count++>5000)
	{
		timer_count = 0;
		timeout_flag=1;
	}

}
int main(void)
{
	Timer_Init;
	Thread_Init;
	while(1)
	{
		if(timeout_flag==1)
		{
			timeout_flag = 0;
			led_toggle; //led翻转
		}
		Do_Other_Things;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值