foxpro2005 发表于 2013-2-27 15:04:45

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

本帖最后由 foxpro2005 于 2013-2-27 16:16 编辑

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

mcu_lover 发表于 2013-2-27 15:49:59

状态变量用参数传进入

foxpro2005 发表于 2013-2-27 16:04:31

本帖最后由 foxpro2005 于 2013-2-27 16:09 编辑

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

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

    if(!lock || lc == ProcessID){
      lock = 1;
      lc = ProcessID;

      if(i == 0) {
            printf("%s\n",str1);
            i++;
      }
      else
      {
            printf("%s\n",str2);
            i = 0;
            lock = 0;
      }
    }
}


int main()
{
    unsigned int i;

    for(i=0; i<3; i++){
      Task("This is 01 task - A","This is 01 task - B",__LINE__);
      Task("This is 02 task - A","This is 02 task - B",__LINE__);
      Task("This is 03 task - A","This is 03 task - B",__LINE__);
      Task("This is 04 task - A","This is 04 task - B",__LINE__);
    }

    return 0;
}
是否还有更好的办法?
CB的工程文件:

xivisi 发表于 2013-2-27 17:40:47

状态函数所有变量(含状态)用一个结构体保存,每次调用该函数,传入结构体指针

foxpro2005 发表于 2013-2-27 18:19:08

xivisi 发表于 2013-2-27 17:40 static/image/common/back.gif
状态函数所有变量(含状态)用一个结构体保存,每次调用该函数,传入结构体指针 ...

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

xivisi 发表于 2013-2-27 18:22:24

foxpro2005 发表于 2013-2-27 18:19 static/image/common/back.gif
xivisi 大侠:可以举个例子么? 谢谢

参考,傻孩子帖子

foxpro2005 发表于 2013-2-27 18:46:27

xivisi 发表于 2013-2-27 18:22 static/image/common/back.gif
参考,傻孩子帖子

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

xivisi 发表于 2013-2-27 19:00:24

foxpro2005 发表于 2013-2-27 18:46 static/image/common/back.gif
刚才找了一下,可以给一个具体的链接么? 谢谢   (不要BS我哈....)

typedef struct TimeOutState
{
        int State;
        unsigned int StartTime;
        unsigned int TimeOut;
        unsigned int EndTime;
} TimeOutState;

int TimeOut(TimeOutState* Args)
{
        extern unsigned int SystemTime;

        switch(Args->State)
        {
        case 0:
                Args->StartTime=SystemTime;
                Args->State++;
        case 1:
                if((SystemTime-Args->StartTime)<Args->TimeOut)
                {
                        return Args->State;
                }
                Args->State++;
                Args->EndTime=SystemTime;
        }
}算了,这有个简单的超时代码,SystemTime是系统定时器中断自增的

xivisi 发表于 2013-2-27 19:00:56

返回值,根据需要,可返回状态

foxpro2005 发表于 2013-2-28 23:19:51

xivisi 发表于 2013-2-27 19:00 static/image/common/back.gif
返回值,根据需要,可返回状态

非常感谢

hamipeter 发表于 2013-3-1 17:43:17

返回值用结构体指针

Free_Bird 发表于 2013-3-7 18:31:43

{:lol:}收获很大,谢谢
页: [1]
查看完整版本: 子函数用状态机写法,如何解决多处调用重入问题?[已解决]