程序调用的几种方式

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

你可能感兴趣的:(C语言,嵌入式硬件)