搜索
bottom↓
回复: 11

子函数用状态机写法,如何解决多处调用重入问题?[已解决]

[复制链接]

出0入76汤圆

发表于 2013-2-27 15:04:45 | 显示全部楼层 |阅读模式
本帖最后由 foxpro2005 于 2013-2-27 16:16 编辑

遇到个问题,子函数也采用状态机写法,如果这个子函数被多处调用,如何解决多处调用重入问题?

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入264汤圆

发表于 2013-2-27 15:49:59 来自手机 | 显示全部楼层
状态变量用参数传进入

出0入76汤圆

 楼主| 发表于 2013-2-27 16:04:31 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-2-27 16:09 编辑

找到解决办法了,利用信号量互锁机制。(并使用行号来作进程任务号)
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void Task(char *str1, char *str2, unsigned int ProcessID)
  4. {
  5.     static unsigned int lc = 0;             // 记录进程号(行号)
  6.     static unsigned char lock = 0;          // 信号锁
  7.     static unsigned char i = 0;

  8.     if(!lock || lc == ProcessID){
  9.         lock = 1;
  10.         lc = ProcessID;

  11.         if(i == 0) {
  12.             printf("%s\n",str1);
  13.             i++;
  14.         }
  15.         else
  16.         {
  17.             printf("%s\n",str2);
  18.             i = 0;
  19.             lock = 0;
  20.         }
  21.     }
  22. }


  23. int main()
  24. {
  25.     unsigned int i;

  26.     for(i=0; i<3; i++){
  27.         Task("This is 01 task - A","This is 01 task - B",__LINE__);
  28.         Task("This is 02 task - A","This is 02 task - B",__LINE__);
  29.         Task("This is 03 task - A","This is 03 task - B",__LINE__);
  30.         Task("This is 04 task - A","This is 04 task - B",__LINE__);
  31.     }

  32.     return 0;
  33. }
复制代码
是否还有更好的办法?
CB的工程文件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-2-27 17:40:47 | 显示全部楼层
状态函数  所有变量(含状态)用一个结构体保存,每次调用该函数,传入结构体指针

出0入76汤圆

 楼主| 发表于 2013-2-27 18:19:08 | 显示全部楼层
xivisi 发表于 2013-2-27 17:40
状态函数  所有变量(含状态)用一个结构体保存,每次调用该函数,传入结构体指针 ...

xivisi 大侠:可以举个例子么? 谢谢

出0入0汤圆

发表于 2013-2-27 18:22:24 | 显示全部楼层
foxpro2005 发表于 2013-2-27 18:19
xivisi 大侠:可以举个例子么? 谢谢

参考,傻孩子帖子

出0入76汤圆

 楼主| 发表于 2013-2-27 18:46:27 | 显示全部楼层
xivisi 发表于 2013-2-27 18:22
参考,傻孩子帖子


刚才找了一下,可以给一个具体的链接么? 谢谢   (不要BS我哈....)

出0入0汤圆

发表于 2013-2-27 19:00:24 | 显示全部楼层
foxpro2005 发表于 2013-2-27 18:46
刚才找了一下,可以给一个具体的链接么? 谢谢   (不要BS我哈....)
  1. typedef struct TimeOutState
  2. {
  3.         int State;
  4.         unsigned int StartTime;
  5.         unsigned int TimeOut;
  6.         unsigned int EndTime;
  7. } TimeOutState;

  8. int TimeOut(TimeOutState* Args)
  9. {
  10.         extern unsigned int SystemTime;

  11.         switch(Args->State)
  12.         {
  13.         case 0:
  14.                 Args->StartTime=SystemTime;
  15.                 Args->State++;
  16.         case 1:
  17.                 if((SystemTime-Args->StartTime)<Args->TimeOut)
  18.                 {
  19.                         return Args->State;
  20.                 }
  21.                 Args->State++;
  22.                 Args->EndTime=SystemTime;
  23.         }
  24. }
复制代码
算了,这有个简单的超时代码,SystemTime是系统定时器中断自增的

出0入0汤圆

发表于 2013-2-27 19:00:56 | 显示全部楼层
返回值,根据需要,可返回状态

出0入76汤圆

 楼主| 发表于 2013-2-28 23:19:51 | 显示全部楼层
xivisi 发表于 2013-2-27 19:00
返回值,根据需要,可返回状态

非常感谢

出0入0汤圆

发表于 2013-3-1 17:43:17 来自手机 | 显示全部楼层
返回值用结构体指针

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 09:29

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

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