搜索
bottom↓
回复: 4

一个简单的程序解释protothread的原理

[复制链接]

出0入0汤圆

发表于 2013-11-6 10:27:53 | 显示全部楼层 |阅读模式
本帖最后由 LGT 于 2013-11-6 10:29 编辑

看到smset推荐的protothread, 感觉挺有意思, 看了下源代码, 把原理用一段简单的C代码解释一下,
希望对还不是很了解的同学有帮助:
  1. #include <stdio.h>

  2. void thread_fsm(char *tname, unsigned char *status)
  3. {
  4.         switch(*status) { case 0: // PT_BEGIN
  5.                 while(1) {
  6.                         printf("%s: Here is step 0!\n", tname);
  7.                         if('q' != getchar())
  8.                                 return;
  9.                         *status = __LINE__; case __LINE__:  // must be kept in same line, or the two __LINE__ will not equal
  10.                         printf("%s: Here is step 1!\n", tname);
  11.                         if('q' != getchar())
  12.                                 return;
  13.                         *status = __LINE__; case __LINE__:
  14.                         printf("%s: Here is step 2!\n", tname);
  15.                         if('q' != getchar())
  16.                                 return;
  17.                         printf("%s: Now return to step 0!\n", tname);
  18.                         *status = 0;
  19.                         break;
  20.                         default:
  21.                                 printf("%s: Got wrong status!\n", tname);
  22.                 }
  23.         }       
  24. }

  25. int main(int argc, char *argv[]) {
  26.        
  27.         unsigned char status1 = 0;        // PT_INIT
  28.         unsigned char status2 = 0; // PT_INIT
  29.        
  30.         while(1) {
  31.                 thread_fsm("thread 1", &status1);
  32.                 thread_fsm("thread 2", &status2);
  33.         }
  34.        
  35. }
复制代码
运行上面的代码,输入q+回车,就可以看到thread的执行了。
thread的写法如果变的规范些, 然后把__LINE__替换成具体的数值,就更容易懂了:
  1. void thread_fsm(char *tname, unsigned char *status)
  2. {
  3.         switch(*status) {
  4.                 case 0: // PT_BEGIN
  5.                         while(1) {
  6.                                 printf("%s: Here is step 0!\n", tname);
  7.                                 if('q' != getchar())
  8.                                         return;
  9.                                 *status = 1;
  10.                 case 1:
  11.                         printf("%s: Here is step 1!\n", tname);
  12.                         if('q' != getchar())
  13.                                 return;
  14.                         *status = 2;
  15.                 case 2:
  16.                         printf("%s: Here is step 2!\n", tname);
  17.                         if('q' != getchar())
  18.                                 return;
  19.                         printf("%s: Now return to step 0!\n", tname);
  20.                         *status = 0;
  21.                         break;
  22.                 default:
  23.                         printf("%s: Got wrong status!\n", tname);
  24.                 }
  25.         }       
  26. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2013-11-6 13:10:44 | 显示全部楼层
protothread 本质上确实就是状态机,只是在语法上模仿了线程的写法。

也只有在C语言里,才能使用这种写法。

出0入0汤圆

发表于 2013-11-6 13:26:39 来自手机 | 显示全部楼层
嗯嗯   还是有用

出0入0汤圆

发表于 2013-11-6 13:50:14 | 显示全部楼层
本帖最后由 kinsno 于 2013-11-6 13:51 编辑
smset 发表于 2013-11-6 13:10
protothread 本质上确实就是状态机,只是在语法上模仿了线程的写法。

也只有在C语言里,才能使 ...


1、SWITCH基本上就不要想用了,清一水的IF吧,这个不太好,整个程序封杀了SWITCH,这个也让人不爽。
2、虽然有定时器和信号阻塞,但是只能在任务函数里用,在底层,或底底层或驱动层,它没法用了;这个让人不爽。
归根到底:有这两种限制,倒不如说是个时间片轮转。
PS:兄弟,能不能整一个GOTO版本啊。用了GOTO版本至少解决了switch,但是第2个问题,不好弄了,有建议不?

出0入0汤圆

发表于 2013-11-6 23:27:11 来自手机 | 显示全部楼层
巧妙的用了c的语法啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 00:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表