ProtothreadS学习资料整理

ProtothreadS学习资料,对网上资料的整理,加入了些自己的理解。

注意:

(1)任务中使用的变量应为静态变量

(2)线程内不能使用纯while(1)--即含PT_WAIT_UNTIL()等宏的while(1)是可以的。

不能在switch(){case…}中调用任务Protothreads API带有case的语句(即只能单向嵌套)。 (3)线程内可以使用: for(){…}

switch(){case…}-- case与case之间必须是一个完整的语句或者语句段 if(){…}else{…} 含宏的while(1){…}

(4)ProtothreadS系统可以仍然还是个大while(1)循环。但也可设计为根据定时器产生的恒定间隔的中断来触发和管理任务--时间触发方式的嵌入式系统,此时可更改pt结构体为(见《时间触发模式下的ProtothreadS设计应用》): struct pt{

lc_t lc;

unsigned short count; // 每次中断都减1 unsigned short load; // 初始计数值 char ready; // 任务就绪标志 }

(5)在ProtothreadS系统中延时:

1)如果ProtothreadS系统是基于时间触发,则延时可基于该触发--即基于系统时钟。 2)如果ProtothreadS系统中无系统时钟,

(6)Protothreads虽然提供了在各自线程内的条件阻塞机制,但对于在该线程内调用的其它函数,则无法阻塞其运行。所以,如果要在线程内调用占用时间较多的函数,为保证各个线程的实时性要求,需要将这类函数进一步划分为更小的函数,分步执行。

(7)Protothread的精华:当Protothread程序运行到PT_WAIT_UNTIL时,判断其运行条件是否满足,若不满足,则阻塞。

Protothread的阻塞其实质就是函数返回。 Protothread仅能在程序员指定位置阻塞。 (8)能满足系统实时性要求的条件是:(当且仅当)TaskA 、TaskB、TaskC三个任务的运行时间之和要小于系统实时响应的时间要求。

(9)由于事件驱动模型没有阻塞机制,因此需要由程序员构造一个有限状态机来实现顺序流控制。

ProtothreadS函数说明1:

函数 说明 PT_INIT(pt) 初始化任务变量,只在初始化函数中执行一次就行 PT_BEGIN(pt) 启动任务处理,放在函数开始处 PT_END(pt) 结束任务,放在函数的最后

等待某个条件(条件可以为时钟或其它变量,IO等)成立,否则直接退

PT_WAIT_UNTIL(pt, condition)

出本函数,下一次进入本函数就直接跳到这个地方判断

PT_WAIT_WHILE(pt, cond) 和上面一个一样,只是条件取反了 PT_WAIT_THREAD(pt, thread) 等待一个子任务执行完成 PT_SPAWN(pt, child, thread) 新建一个子任务,并等待其执行完退出 PT_RESTART(pt) 重新启动某个任务执行 PT_EXIT(pt) 任务后面的部分不执行,直接退出重新执行 PT_YIELD(pt) 锁死任务 PT_YIELD_UNTIL(pt, cond) 锁死任务并在等待条件成立,恢复执行

ProtothreadS函数说明2: 函数 说明 struct pt {

lc_t lc;};

Initialize a protothread

#define PT_INIT(pt) LC_INIT((pt)->lc) 初始化Protothread线程,实际上是将线程控制结构

体里的lc置0

Declaration of a protothread

#define PT_THREAD(name_args) char name_args 声明线程

例如:PT_THREAD(task1(struct pt *pt))

#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; Declare the start of a protothread LC_RESUME((pt)->lc) 启动任务处理 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ Declare the end of a protothread

你可能喜欢

  • 任务系统
  • 嵌入式系统
  • 学习笔记
  • 协议分析
  • STM32开发
  • 任务管理
  • 时间管理
  • 系统配置

ProtothreadS学习资料整理相关文档

最新文档

返回顶部