|
发表于 2012-2-28 15:01:11
|
显示全部楼层
理论上确实是不需要的,PT_YIELD_FLAG只是一个HACK.
你需要仔细看看宏定义,另外,如果你用gcc的话,可以用 gcc 的 -E -P 来输出展开宏之后的代码,方便分析
比如下例:
#include "pt.h"
static PT_THREAD(blah(struct pt *pt))
{
static int delay;
PT_BEGIN(pt);
for(delay = 1234; delay > 0; delay -= 1) {
// do something
// ...
// NOTE: Yield here
PT_YIELD(pt);
}
PT_END(pt);
}
展开后:
typedef unsigned short lc_t;
struct pt {
lc_t lc;
};
static char blah(struct pt *pt)
{
static int delay;
{ char PT_YIELD_FLAG = 1; switch((pt)->lc) { case 0:; // 这里先让PT_YIELD_FLAG = 1, 再执行跳转
for(delay = 1234; delay > 0; delay -= 1) {
do { PT_YIELD_FLAG = 0; (pt)->lc = 13; case 13:; if(PT_YIELD_FLAG == 0) { return 1; } } while(0); // 注意这一行
}
}; PT_YIELD_FLAG = 0; (pt)->lc = 0;; return 3; };
}
主要注意红色这一行,"(pt)->lc = 13" 和 "case 13:",你要分析一下两次执行blah()会发生什么情况。
其实有办法让 (pt)->lc 等于跳过 "return 1" 下面一句的行标,PT_YIELD_FLAG 就完全不需要了,只是宏定义起来不会优雅。 |
|