Protothread调度分析

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;
}

PT的一个核心结构体
struct pt {
  lc_t lc;
};
lc是local的意思,表示线程的一个变量,作为状态的一个判断值。
PT_INIT()、PT_BEGIN()、PT_WAIT_UNTIL()是PT_FSM提供给用户的API,本质上是宏定义。先看一下PT_INIT()原型,#define PT_INIT(pt)   LC_INIT((pt)->lc),

 #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)

#define LC_SET(s) s = __LINE__; case __LINE__:  这个宏定义就类似与传统操作系统的任务切换保护上下文的关键地方,设置S = __LINE__, 然后 case __LINE__, 使CPU可以继续向下继续运行,判断条件是否符合,return 就是切换线程的关键点,当下次执行到该线程时候,可以从断点继续运行,所以LINE就是保护上下文的变量,而这个变量是编译器的一个关键字,用以指示本行语句在源文件中的位置信息,占用空间两个字节。这里也体现了实时性,切换线程时候,相对于传统操作系统,并不需要人为去保存线程上下文。PT_WAIT_UNTIL可以灵活放置在用户代码中,以便从断点继续运行。这里是最关键的设计。
所以三个宏展开,整体看起来就是
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是一种抽象的编程软件框架,它提供了条件阻塞状态语句,PT_WAIT_UNTIL(), 旨在针对内存受限制的一种简化事件编程驱动模型的嵌入式软件系统。该系统提供条件语句阻塞线程,直到线程满足条件才可以继续执行。如果第一次运行到PT_WAIT_UNTIL(), 条件满足,那么线程继续执行,不会受到其他干扰。PT_WAIT_UNTIL()是每一次执行线程必须经过的代码,条件可以是任意类型。如果条件不满足,保存当前代码行号,下次切换到此任务时,利用该swich的控制变量,在这断点执行。

总结:PT 占用内存小,十几个字节就可以运行,可以多任务运行,每个任务保存上下文只占用两个字节。

缺点:线程的局部变量在切换任务时候会丢失数据,使用不当会造成灾难性的BUG,可以准确的的说,PT切换任务时候,只保存断点信息,并未真正保存任务寄存器的信息。

你可能感兴趣的:(Protothread调度分析)