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