查看: 3196|回复: 2

[软件] 将Protothreads轻量级多线程系统应用到Uno32中

[复制链接]

该用户从未签到

发表于 2012-8-8 15:37:22 | 显示全部楼层 |阅读模式
分享到:
原帖由
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)
回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-2 22:34:52 | 显示全部楼层
    顶一个~~~~~~~~~~~~~~·
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-28 16:20
  • 签到天数: 980 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-1-5 15:35:18 | 显示全部楼层
    不错 学习了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-20 04:46 , Processed in 0.147453 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.