mysde 发表于 2010-2-12 13:25:59

推荐8位机使用protothreads做为调度程序!

在产品上使用了,效果很好,占用资源小。
搜索站内,有朋友介绍了。
现在版本pt 1.4

youkebing 发表于 2010-2-12 15:18:15

我也觉得这个很好,希望pt能被大多数人使用

huayuliang 发表于 2010-2-14 15:05:15

多谢!!!

savagex 发表于 2010-3-13 14:02:17

很省CPU啊。。。用起来不错。我再试几个例子看看

eworker 发表于 2010-3-13 14:04:59

不错

hongyancl 发表于 2010-3-13 14:16:02

ding

smset 发表于 2010-6-21 11:30:34

顶,感觉还可以,不过好像gcc支持得不好。

dr2001 发表于 2010-6-21 11:55:13

如果内存不紧张,完全没必要用Coroutine/ProtoThread。这个使用起来限制比较多。

当然,拿来控制状态机/程序流程是很好的东西。

eworker 发表于 2010-6-21 12:32:51

回复【7楼】dr2001
如果内存不紧张,完全没必要用coroutine/protothread。这个使用起来限制比较多。
当然,拿来控制状态机/程序流程是很好的东西。
-----------------------------------------------------------------------

如果内存不紧张,那用什么?

cyr_hongfeng 发表于 2010-6-21 12:49:18

回复【8楼】eworker
-----------------------------------------------------------------------

如果内存不紧张,那用什么?

用操作系统

dr2001 发表于 2010-6-21 13:23:36

回复【8楼】eworker
-----------------------------------------------------------------------

OS。或者独立堆栈的Thread。

smset 发表于 2010-7-14 15:19:24

对于资源小的CPU来说,protothread是难得的珍品,非常值得一用。

它的原理简单了极致,资源消耗小到极致,但是又真实的实现了多任务的编程框架。

不过,我在使用过程中,感觉原型的protothread有个不是很方便的地方,就是没有直接延时的函数,总要为线程显式创建一个Timer,然后在线程里面PT_TimerSet,PT_WAIT_UNTIL,编程不直观,为什么不直接设置一个WaitX函数,直接延时多少毫秒,不是更简单吗?

以下为我自己扩展的几个宏,实现了这种“通用的”延时函数,便于简化函数编写。
其基本原理就是在线程里面创建一个static静态的timer,然后名称统一为tmr,线程里面的WaitX函数实际上就用这个tmr。

另外,原来的结构中,线程函数无法被其他线程调用,我定义了PT_CALL宏,可以在一个线程函数中,调用另外一个线程函数。

#define Wait(s,t)    {\
PT_TimerSet((s), (t));\
PT_WAIT_UNTIL(pt, PT_TimerExpired(s));\
}

#define WaitX(t)   Wait(&tmr,t)
#define _SSPT_BEGIN(pt); PT_INIT(pt); static PT_TMR_Create(tmr);
#define _EEPT_END(pt);

#define PT_CALL(x){\
Wait(&tmr,0)\
int k; \
while(1) {\
   k=(x)(&PT_TCB(x));\
   if (k==PT_ENDED) break; \
   return k;\
}\
}

//-使用以上宏的线程,感觉比原来的更简单了-------------------
extern PT_TSK_Create(myfun1);//myfun1也是一个pt线程

PT_TSK_Create(protothread2);
unsigned char protothread2(struct pt *pt)
{
static int i;
_SS
i=1;
while(i++<=3) PT_CALL(myfun1);
while(1)
{
      WaitX(200);
      Form1->Memo1->Lines->Add("this is 2");
}
_EE
}
//-------------------------------------------------

smset 发表于 2010-7-14 15:24:15

实际上,只需极简单的修改,Protothread就可以实现抢占式多任务,协同和抢占式任务也可以同时存在。

基本方法就是把抢占式任务放定时中断里执行。

sunchao151 发表于 2010-10-29 15:19:00

mark

fengtianzhifeng 发表于 2012-6-27 09:28:29

markmarkmarkmarkmark

eddia2012 发表于 2012-11-17 10:31:49

{:smile:}一错,好东西.谢谢分享.

hclin 发表于 2012-11-19 10:14:00

good job !!!

luckseason 发表于 2013-9-13 13:44:43

看看。。

dwiller_ARM 发表于 2013-12-19 15:23:45

MARK!!!

luvemcu 发表于 2013-12-20 18:45:07

mark a mark

电子小生 发表于 2013-12-20 18:52:25

好东西,收下

al88 发表于 2017-12-13 11:35:10

很好不错,下来用一下、

al88 发表于 2018-4-19 10:43:02

很棒,,不错

gaobao_1 发表于 2018-5-2 11:43:15

很少用调度器,一般都是裸奔。有用过实际项目中的吗?
页: [1]
查看完整版本: 推荐8位机使用protothreads做为调度程序!