|
发表于 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 _SS PT_BEGIN(pt); PT_INIT(pt); static PT_TMR_Create(tmr);
#define _EE PT_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
}
//------------------------------------------------- |
|