|
原帖由
ukonline2000
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------
Protothreads是极轻量级多线程操作系统,适合资源相对紧张的处理器,当然也适合我们的Uno32!
下面是我写的一个简单的例子,例子是实现LED4,LED5分别隔500毫秒、200毫秒闪烁,
已经通过mapide0023编译和测试通过
------------------------------------------------------------------------------------------------------------------------------------------------------
#include <pt.h>
static boolean state1=false,state2=false; //led state
int ledPin1 = 13;
int ledPin2 = 43;
static struct pt pt1, pt2;
/***********************************************************************
Function : TASK_flushLed
Parameters :
size -
***********************************************************************/
/* This function toggles the LED after 'interval' ms passed */
static int TASK_flushLed1(struct pt *pt,int interval) //线程1
{
static unsigned long timestamp = 0;
PT_BEGIN(pt); //线程1开始
while(1)
{
/* each time the function is called the second boolean
* argument "millis() - timestamp > interval" is re-evaluated
* and if false the function exits after that. */
PT_WAIT_UNTIL(pt,millis() - timestamp > interval); //线程等待interval时间后,开始运行
timestamp = millis(); // take a new timestamp
digitalWrite(ledPin1,state1);//led 闪烁
state1=!state1;
}
PT_END(pt); //线程1结束
}
/***********************************************************************
Function : TASK_flushLed
Parameters :
size -
***********************************************************************/
/* This function toggles the LED after 'interval' ms passed */
static int TASK_flushLed2(struct pt *pt,int interval)
{
static unsigned long timestamp = 0;
PT_BEGIN(pt);
while(1)
{
/* each time the function is called the second boolean
* argument "millis() - timestamp > interval" is re-evaluated
* and if false the function exits after that. */
PT_WAIT_UNTIL(pt,millis() - timestamp > interval);
timestamp = millis(); // take a new timestamp
digitalWrite(ledPin2,state2);
state2=!state2;//led state
}
PT_END(pt);
}
void setup()
{
pinMode(ledPin1,OUTPUT);
pinMode(ledPin2,OUTPUT);
PT_INIT(&pt1); //初始化线程1
PT_INIT(&pt2); //初始化线程2
}
void loop () //loop函数将作为行线程启动的地方
{
TASK_flushLed1(&pt1,500); //启动线程1,“500”为定时时间,
TASK_flushLed2(&pt2,200); //启动线程2,“200”为定时时间,
}
------------------------------------------------------------------------------------------------------------------------------------------------------
在pt.h中定义了很多功能:
PT_INIT(pt) 初始化任务变量,只在初始化函数中执行一次就行
PT_BEGIN(pt) 启动任务处理,放在函数开始处
PT_END(pt) 结束任务,放在函数的最后
PT_WAIT_UNTIL(pt, condition) 等待某个条件(条件可以为时钟或其它变量,IO等)成立,否则直接退出本函数,下一次进入本 函数就直接跳到这个地方判断
PT_WAIT_WHILE(pt, condition) 和上面一个一样,只是条件取反了
PT_WAIT_THREAD(pt, thread) 等待一个子任务执行完成
PT_SPAWN(pt, child, thread) 新建一个子任务,并等待其执行完退出
PT_RESTART(pt) 重新启动某个任务执行
PT_EXIT(pt) 任务后面的部分不执行,直接退出重新执行
PT_YIELD(pt) 锁死任务
PT_YIELD_UNTIL(pt, cond) 锁死任务并在等待条件成立,恢复执行
在pt中一共定义四种线程状态,在任务函数退出到上一级函数时返回其状态
PT_WAITING 等待
PT_EXITED 退出
PT_ENDED 结束
PT_YIELDED 锁死
比如PT_WAIT_UNTIL(pt, condition) ,通过改变condition可以运用的非常灵活,比如本例中定时条件,把condition改为定时器溢出,那就是个时间触发系统了,再把condition改为其他条件,就是事件触发系统了
ProtoThreads.zip
(12.33 KB, 下载次数: 5)
|
|