Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167740
  • 博文数量: 27
  • 博客积分: 566
  • 博客等级: 中士
  • 技术积分: 487
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-07 19:07
文章分类

全部博文(27)

文章存档

2013年(23)

2012年(1)

2007年(3)

我的朋友

分类: 嵌入式

2013-04-19 10:20:38




  • PROCESS
PROCESS宏定义在core\sys的process.h文件内,如下:

  1. #define PROCESS(name, strname) \
  2.   PROCESS_THREAD(name, ev, data); \
  3.   struct process name = { NULL, strname, \
  4.                           process_thread_##name }
  5. #define PROCESS_THREAD(name, ev, data) \
  6. static PT_THREAD(process_thread_##name(struct pt *process_pt, \
  7.                        process_event_t ev, \
  8.                        process_data_t data))
  9. #define PT_THREAD(name_args) char name_args

  • AUTOSTART_PROCESSES

  1. #define AUTOSTART_PROCESSES(...) \
  2. struct process * const autostart_processes[] = {__VA_ARGS__, NULL}



  • ROCESS_BEGIN
  1. #define PROCESS_BEGIN() PT_BEGIN(process_pt)
  2. #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
  3. #define LC_RESUME(s) switch(s) { case 0:

把参数替换,结果如下:
  1. {
  2.     char PT_YIELD_FLAG = 1; /*将PT_YIELD_FLAG置1,类似于关中断???*/
  3.     switch(process_pt->lc) /*程序根据lc的值进行跳转,lc用于保存程序断点*/
  4.     {
  5.         case 0: /*第一次执行从这里开始,可以放一些初始化的东东*/
  6.             ;
  • PROCESS_END
  1. #define PROCESS_END() PT_END(process_pt)
  2. #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ PT_INIT(pt); return PT_ENDED; }
  3. #define LC_END(s) }
  4. #define PT_INIT(pt) LC_INIT((pt)->lc)
  5. #define LC_INIT(s) s = 0;
  6. #define PT_ENDED 3

  7. 把参数替换,结果如下:
  8.     }
  9.     PT_YIELD_FLAG = 0;
  10.     (process_pt)->lc = 0;
  11.     
  12.     return 3;
  13. }
  • PROCESS_YIELD
  1. /*即进程主动让出执行权*/
  2. #define PROCESS_YIELD() PT_YIELD(process_pt)
  3. #define LC_SET(s) s = __LINE__; case __LINE__: /*保存被中断的行数*/

  4. /*继续展开如下,Yield from the current protothread*/
  5. #define PT_YIELD(pt) \
  6. do { \
  7. PT_YIELD_FLAG = 0; \
  8. LC_SET((pt)->lc); \
  9. if(PT_YIELD_FLAG == 0) { \
  10. return PT_YIELDED; \
  11. } \
  12. } while(0)

// 把参数替换,结果如下:
  1. do {
  2.     PT_YIELD_FLAG = 0;
  3.     (process_pt)->lc = __LINE__;
  4.     case __LINE__:
  5.     if(PT_YIELD_FLAG == 0) {
  6.         return PT_YIELDED;
  7.     }
  1. } while(0)



阅读(1094) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~