推荐8位机使用protothreads做为调度程序!
在产品上使用了,效果很好,占用资源小。搜索站内,有朋友介绍了。
现在版本pt 1.4 我也觉得这个很好,希望pt能被大多数人使用 多谢!!! 很省CPU啊。。。用起来不错。我再试几个例子看看 不错 ding 顶,感觉还可以,不过好像gcc支持得不好。 如果内存不紧张,完全没必要用Coroutine/ProtoThread。这个使用起来限制比较多。
当然,拿来控制状态机/程序流程是很好的东西。 回复【7楼】dr2001
如果内存不紧张,完全没必要用coroutine/protothread。这个使用起来限制比较多。
当然,拿来控制状态机/程序流程是很好的东西。
-----------------------------------------------------------------------
如果内存不紧张,那用什么? 回复【8楼】eworker
-----------------------------------------------------------------------
如果内存不紧张,那用什么?
用操作系统 回复【8楼】eworker
-----------------------------------------------------------------------
OS。或者独立堆栈的Thread。 对于资源小的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
}
//------------------------------------------------- 实际上,只需极简单的修改,Protothread就可以实现抢占式多任务,协同和抢占式任务也可以同时存在。
基本方法就是把抢占式任务放定时中断里执行。 mark markmarkmarkmarkmark {:smile:}一错,好东西.谢谢分享. good job !!! 看看。。 MARK!!! mark a mark 好东西,收下 很好不错,下来用一下、 很棒,,不错 很少用调度器,一般都是裸奔。有用过实际项目中的吗?
页:
[1]