ProtoThreads 多线程实例

阿喵是朵云 13m2021-08-061322 次点击
```
#include <pt.h>

static int counter1,counter2,state1=0,state2=0;

static int protothread1(struct pt *pt)
{‌‌
PT_BEGIN(pt);
while(1)
{‌‌
PT_WAIT_UNTIL(pt, counter1==1);
digitalWrite(12,state1);
state1=!state1;
counter1=0;
}
PT_END(pt);
}


static int protothread2(struct pt *pt)
{‌‌
PT_BEGIN(pt);
while(1) {‌‌
PT_WAIT_UNTIL(pt, counter2==5);
counter2=0;
digitalWrite(13,state2);
state2=!state2;
}
PT_END(pt);
}


static struct pt pt1, pt2;
void setup()
{‌‌

pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
PT_INIT(&pt1);
PT_INIT(&pt2);
}

void loop ()
{‌‌
protothread1(&pt1);
protothread2(&pt2);
delay(1000);
counter1++;
counter2++;
}
```
此段代码演示了如何使用PT库来实现12、13脚led分别隔1秒、5秒闪烁
```
#include <pt.h>//ProtoThreads必须包含的头文件

static int counter1,counter2,state1=0,state2=0; //counter为定时计数器,state为每个灯的状态

static int protothread1(struct pt *pt) //线程1,控制灯1
{‌‌
PT_BEGIN(pt); //线程开始
while(1) //每个线程都不会死
{‌‌
PT_WAIT_UNTIL(pt, counter1==1); //如果时间满了1秒,则继续执行,否则记录运行点,退出线程1
digitalWrite(12,state1);
state1=!state1;//灯状态反转
counter1=0; //计数器置零
}
PT_END(pt); //线程结束
}


static int protothread2(struct pt *pt) //线程2,控制灯2
{‌‌
PT_BEGIN(pt); //线程开始
while(1) {‌‌ //每个线程都不会死
PT_WAIT_UNTIL(pt, counter2==5); //如果时间满了5秒,则继续执行,否则记录运行点,退出线程2
counter2=0; //计数清零
digitalWrite(13,state2);
state2=!state2; //灯状态反转
}
PT_END(pt); //线程结束
}


static struct pt pt1, pt2;
void setup()
{‌‌

pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
PT_INIT(&pt1); //线程1初始化
PT_INIT(&pt2); //线程2初始化
}

void loop () //这就是进行线程调度的地方
{‌‌
protothread1(&pt1); //执行线程1
protothread2(&pt2); //执行线程2
delay(1000); //时间片,每片1秒,可根据具体应用设置大小
counter1++;
counter2++;
}
```
收藏 ♥ 感谢
暂无回复

登录注册 后可回复。




› 相关内容关注微信公众号