Protothread存在于contiki、uip中,作者是Dunkels, Adam。
官网介绍prothread
Protothreads is a mixture of the event-driven and the multi-threaded programming mechanisms. With protothreads, event-handlers can be made to block, waiting for events to occur.
Find the code in contiki/core/sys/pt.h
.
用户创建线程使用系统提供的API,
static int user_pthread( struct pt *pt) { PT_INIT(pt); PT_BEGIN(pt); PT_WAIT_UNTIL(pt, your_event == event_buff); /*User's code put here */ user_code; }
#define LC_INIT(s) s = 0;
s是state状态的意思,一开始让 s = 0, 原因是为了运行下一句代码PT_BEGIN(), PT_BEGIN()定义如下
#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) #define LC_RESUME(s) switch(s) { case 0:PT_WAIT_UNTIL()的作用就是判断事件是否符合用户的要求,如果符合则触发用户代码,否则退出线程。
#define PT_WAIT_UNTIL(pt, condition) \ do { \ LC_SET((pt)->lc); \ if(!(condition)) { \ return PT_WAITING; \ } \ } while(0)
S = 0 Switch (s){ Case 0: /*Three line is the key to switch thread, real time*/ S = __LINE__; Case __LINE__: if( !condition ) return 0; }
总结:PT 占用内存小,十几个字节就可以运行,可以多任务运行,每个任务保存上下文只占用两个字节。
缺点:线程的局部变量在切换任务时候会丢失数据,使用不当会造成灾难性的BUG,可以准确的的说,PT切换任务时候,只保存断点信息,并未真正保存任务寄存器的信息。