- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在Arduino中使用ProtoThread创建多线程系统
原文地址: /thread-610-1-1.html
一个非常强大的多任务库,非常适合arduino这种资源非常有限的单片机优点1、超轻量级,他的库基本上都是些宏定义,大小可以忽略不计,而且每个线程只占用2个字节2、无机器码,纯c实现,所以可移植性很好3、无堆栈4、简单使用可以只把他当个调度程序,复杂点也能把他当操作系统来使PT作者的首页http://www.sics.se/~adam/pt/先上一段简单的代码look look
#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秒闪烁,已经在arduino09上测试通过sorry,无注释。。别急,这只是个演示这篇文章会不断更新,分别讲述PT库的原理和应用让大家能开发出更复杂的程序好介绍开始了~Protothread是专为资源有限的系统设计的一种耗费资源特别少并且不使用堆栈的线程模型,其特点是:??◆ 以纯C语言实现,无硬件依赖性;??◆ 极少的资源需求,每个Protothread仅需要2个额外的字节;??◆ 可以用于有操作系统或无操作系统的场合;??◆ 支持阻塞操作且没有栈的切换。使用Protothread实现多任务的最主要的好处在于它的轻量级。每个Protothread不需要拥有自已的堆栈,所有的Protothread 共享同一个堆栈空间,这一点对于RAM资源有限的系统尤为有利。相对于操作系统下的多任务而言,每个任务都有自已的堆栈空间,这将消耗大量的RAM资源,而每个Protothread仅使用一个整型值保存当前状态。??咱们来结合一个最简单的例子来理解ProtoThreads的原理吧,就拿上面的闪烁灯代码来说
#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秒,则继续执行,否则
文档评论(0)